У меня есть задача «sync», которая опирается на несколько «подзадач», которые включают асинхронные сетевые операции, но которые требуют доступа к одному NSManagedObjectContext
. Из-за требований к потоку NSManagedObjectContext
s, мне нужно, чтобы каждая из этих подзадач выполнялась в одном потоке. Из-за объема обработки, выполняемой в некоторых из этих задач, мне нужно, чтобы они были в фоновом потоке.Как мне запустить NSRunLoop и убедиться, что у него есть NSAutoreleasePool, который очищается?
На данный момент я запускаю новую нить, делая это в моем одноплодной -init
метода SyncEngine
объекта:
[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, чтобы создать пул автозапуска и слить его после каждого прогона?
У меня есть 7-8 методов (и, возможно, в конечном итоге их больше), которым нужен пул автозапуска на фоновом потоке. Если есть способ настроить его и вытереть из самого цикла запуска (например, как CocoaTouch делает это для основного потока), это определенно было бы предпочтительнее. –
Я думаю, что вы можете использовать наблюдателей цикла цикла, чтобы знать, когда это делается для обработки события. Для получения дополнительной информации просмотрите документы Apple. – InFreefall