2016-03-21 16 views
-2

Ich habe eine Methode say someMethod(), ich möchte immer diese Methode sollte unter Haupt-Thread ausgeführt werden. Also schrieb ich diese Methode wie folgt ..Wie kann ich bestätigen, dass eine Methode unter dem Hauptzweig in Ziel C ausgeführt wird?

-(void)someMethod 
{ 
    if([NSThread mainThread]) 
    { 
     // Do method stuffs 
    } 

    else 
    { 
     [self performSelectorOnMainThread:@selector(someMethod) withObject:nil waitUntilDone:YES]; 
    } 
} 

Fragen:

  • Ist es der richtige Ansatz?
  • Wenn ich diese Methode von Hintergrundthread aufrufen, was wird passieren?

Dank

+2

Verwenden Sie [NSThread isMainThread], um zu überprüfen, ob ur-Code auf Haupt-Thread läuft oder nicht. –

Antwort

-1

Ihr Beispiel ist korrekt. Unter iOS muss alles, was mit der Benutzeroberfläche zu tun hat, im Hauptthread ausgeführt werden. Wenn Code, der die Benutzeroberfläche ändert, auf einem Hintergrundthread ausgeführt wird, ist das Verhalten nicht definiert. Wenn Ihr Code die Benutzeroberfläche nicht ändert, können Sie ihn mit einem Hintergrundthread ausführen.

1

Das "waitUntilDone: YES" ist gefährlich, es kann zu einem Deadlock führen, wenn Sie nicht aufpassen. Müssen Sie wirklich warten, bis die Methode beendet ist? Vermeiden Sie dies wenn überhaupt möglich.

gcd ist viel flexibler; dispatch_async zum Hauptthread funktioniert auch dann, wenn Sie eine Methode mit allen Arten von Parametern haben, einschließlich Parametern, die keine Objekte sind.

Und wenn Sie bestätigen wollen, dass das Verfahren auf dem Haupt-Thread aufgerufen wird, das heißt, wenn es auf einem anderen Thread ruft ein Fehler wäre, dann verwenden Sie NSAssert.

-1

Nein, in Ihrem Fall kann diese Methode in jedem Thread aufgerufen werden, und Sie tun Methodenstopfen nur, wenn es der Hauptthread ist. Ein besserer Ansatz wäre es, immer die Methode auf dem Haupt-Thread aufrufen,

// auf Ihre Methode aufrufen, wie diese

dispatch_async(dispatch_get_main_queue(), ^{ 
    someMethod() 
}); 

bearbeiten: Sie können auch überprüfen in der Methode selbst, dass Sie sich gerade befinden der Hauptthread

if([NSThread mainThread]) 
    { 
     // Do method stuffs 
    } 

    else 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
     someMethod() 
     }); 
    }