我有一個「同步」任務,依賴於幾個「子任務」,其中包括異步網絡操作,但都需要訪問單個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創建自動釋放池並在每次運行後耗盡它?
我有7-8個方法(最終可能會有更多)需要後臺線程上的自動釋放池。如果有一種方法可以將其設置並從運行循環中排除它(比如CocoaTouch對主線程的操作),那肯定會更好。 – 2010-05-14 10:19:31
我認爲你可以使用運行循環觀察者來了解處理事件的時間。有關更多信息,請參閱Apple文檔。 – InFreefall 2010-07-20 23:41:42