webentwicklung-frage-antwort-db.com.de

Prüfen Sie, ob der aktuelle Thread der Haupt-Thread ist

Gibt es eine Möglichkeit zu überprüfen, ob der aktuelle Thread der Haupt-Thread in Objective-C ist oder nicht?

Ich möchte so etwas tun.

  - (void)someMethod
  {
    if (IS_THIS_MAIN_THREAD?) {
      NSLog(@"ok. this is main thread.");
    } else {
      NSLog(@"don't call this method from other thread!");
    }
  }
111
fish potato

Schauen Sie sich die NSThread API-Dokumentation an .

Es gibt Methoden wie

- (BOOL)isMainThread

+ (BOOL)isMainThread

und + (NSThread *)mainThread

159
rano

Wenn Sie möchten, dass eine Methode im Hauptthread ausgeführt wird, können Sie:

- (void)someMethod
{
    dispatch_block_t block = ^{
        // Code for the method goes here
    };

    if ([NSThread isMainThread])
    {
        block();
    }
    else
    {
        dispatch_async(dispatch_get_main_queue(), block);
    }
}
20
boherna

In Swift3  

if Thread.isMainThread {
    print("Main Thread")
}
15
dimo hamdy

Wenn Sie wissen möchten, ob Sie sich im Haupt-Thread befinden, können Sie einfach den Debugger verwenden. Legen Sie einen Haltepunkt in der Zeile fest, an der Sie interessiert sind. Wenn Ihr Programm es erreicht, rufen Sie Folgendes auf:

(lldb) thread info

Daraufhin werden Informationen zu dem Thread angezeigt, in dem Sie sich befinden:

(lldb) thread info thread #1: tid = 0xe8ad0, 0x00000001083515a0 MyApp`MyApp.ViewController.sliderMoved (sender=0x00007fd221486340, self=0x00007fd22161c1a0)(ObjectiveC.UISlider) -> () + 112 at ViewController.Swift:20, queue = 'com.Apple.main-thread', stop reason = breakpoint 2.1

Wenn der Wert für queuecom.Apple.main-thread lautet, befinden Sie sich im Hauptthread. 

11
Eric

Das folgende Muster stellt sicher, dass eine Methode im Hauptthread ausgeführt wird:

- (void)yourMethod {
    // make sure this runs on the main thread 
    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:_cmd/*@selector(yourMethod)*/
                               withObject:nil
                            waitUntilDone:YES];
        return;
    }
    // put your code for yourMethod here
}
6
T.J.
void ensureOnMainQueue(void (^block)(void)) {

    if ([[NSOperationQueue currentQueue] isEqual:[NSOperationQueue mainQueue]]) {

        block();

    } else {

        [[NSOperationQueue mainQueue] addOperationWithBlock:^{

            block();

        }];

    }

}

beachten Sie, dass ich die Operationswarteschlange und nicht den Thread überprüfe, da dies eine sicherere Vorgehensweise ist

3
Peter Lapisu

Für Monotouch/Xamarin iOS können Sie die Überprüfung auf folgende Weise durchführen:

if (NSThread.Current.IsMainThread)
{
    DoSomething();
}
else
{
    BeginInvokeOnMainThread(() => DoSomething());
}
2
Daniele D.

Zwei Wege. Aus der Antwort von @ rano 

[[NSThread currentThread] isMainThread] ? NSLog(@"MAIN THREAD") : NSLog(@"NOT MAIN THREAD");

Ebenfalls,

[[NSThread mainThread] isEqual:[NSThread currentThread]] ? NSLog(@"MAIN THREAD") : NSLog(@"NOT MAIN THREAD");
2
Tom Howard

Schnelle Version


if (NSThread.isMainThread()) {
    print("Main Thread")
}
1
Michael

lassen Sie isOnMainQueue = (dispatch_queue_get_label (dispatch_get_main_queue ()) == dispatch_queue_get_label (DISPATCH_CURRENT_QUEUE_LABEL))

Überprüfen Sie diese Antwort unter https://stackoverflow.com/a/34685535/1530581

0
JerryZhou