2012-06-22 22 views

Antwort

21

Grand Central Dispatch hat dispatch_after(), die einen Block nach einer bestimmten Zeit in einer angegebenen Warteschlange ausführen wird. Wenn Sie eine Hintergrundwarteschlange erstellen, haben Sie die gewünschte Funktionalität.

dispatch_queue_t myBackgroundQ = dispatch_queue_create("com.romanHouse.backgroundDelay", NULL); 
// Could also get a global queue; in this case, don't release it below. 
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, seconds * NSEC_PER_SEC); 
dispatch_after(delay, myBackgroundQ, ^(void){ 
    [self delayedMethodWithObject:someObject]; 
}); 
dispatch_release(myBackgroundQ); 
4
[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)] 

Führt einen Selektor für den Thread aus, der aufgerufen wird. Also, wenn Sie es von einem Hintergrund-Thread aufrufen, wird es dort laufen ...

+0

das Problem ist, dass, wenn '[self perform: (SEL) withobject: (id) afterDelay: (NSTimeInterval)]' allein in einem Hintergrund-Thread verwendet wird, ist es nicht –

2

Sie können tun, dass pro Beispiel:

dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, <delay in seconds> * NSEC_PER_SEC); 
dispatch_after(delay, dispatch_get_main_queue(), ^{ 
    [self performSelectorInBackground: <sel> withObject: <obj>] 
}); 

Irgendwie eine gemischte Lösung. Es wäre besser, bei einem vollständigen GCD-Ansatz zu bleiben.

7

Versuchen Sie Folgendes:

// Run in the background, on the default priority queue 
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    [self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)] 
}); 

-Code nicht

getestet

Beachten Sie, dass Ihre Wähler/Methode nicht UIKit (also nicht aktualisieren, um die UI) oder den Zugriff UIKit Eigenschaften (wie Rahmen) verwenden müssen, Daher muss der Selektor möglicherweise mit der Arbeit zum Hauptthread zurückkehren. z.B.

(id)SomeMethod:UsingParams: { 

    // Do some work but the results 

    // Run in the background, on the main queue 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Do something UIKit related 
    }); 
} 
+3

+1 für ausgeführt wird, die UI zu erwähnen sollte nicht von einem Hintergrund-Thread berührt werden. – Barjavel

Verwandte Themen