1

我有一個「同步」任務,依賴於幾個「子任務」,其中包括異步網絡操作,但都需要訪問單個NSManagedObjectContext。由於NSManagedObjectContext的線程要求,我需要這些子任務中的每一個在同一個線程上執行。由於這些任務中的一部分處理量很大,我需要它們處於後臺線程。如何啓動一個NSRunLoop,並確保它有一個NSAutoreleasePool被清空?

目前,我在我的單身SyncEngine對象的-init方法做這個推出一個新的線程:

[self performSelectorInBackground:@selector(initializeSyncThread) withObject:nil]; 

-initializeSyncThread方法是這樣的:

- (void)initializeSyncThread 
{ 
    self.syncThread = [NSThread currentThread]; 
    self.managedObjectContext = [(MyAppDelegate *)[UIApplication sharedApplication].delegate createManagedObjectContext]; 
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 
    [runLoop run]; 
} 

是這個正確的方式來啓動這個線程的NSRunLoop?有沒有更好的方法來做到這一點?運行循環只需要處理'performSelector'源,並且它(和它的線程)應該在該進程的整個生命週期內運行。

當談到設置NSAutoreleasePool時,我應該使用Run Loop Observers創建自動釋放池並在每次運行後耗盡它?

回答

0

我不是100%肯定這是爲您解決問題最有效的方式,但我在做這樣的...

由於異步網絡操作可以採取不同的時間才能完成(或超時)我跟蹤一個實例變量(在這種情況下一個布爾稱爲callComplete

當網絡reqeust的射擊代碼開始,並且我的NSURLConnection已經消失,做它的魔術,我等待這個電話就像這樣完成。

while(!callComplete && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]){ 
    // Here you can perform other checks, like making sure the method isn't running forever (with a timeout variable) 
    // Just set callComplete to YES when done 
} 
0

關於NSAutoreleasePool,我只是在我的選擇器的開始處創建一個,它在後臺運行。然後在運行循環完成後(我的通話完成),我照常發佈,然後返回。

+0

我有7-8個方法(最終可能會有更多)需要後臺線程上的自動釋放池。如果有一種方法可以將其設置並從運行循環中排除它(比如CocoaTouch對主線程的操作),那肯定會更好。 – 2010-05-14 10:19:31

+0

我認爲你可以使用運行循環觀察者來了解處理事件的時間。有關更多信息,請參閱Apple文檔。 – InFreefall 2010-07-20 23:41:42

相關問題