1

У меня есть задача «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, чтобы создать пул автозапуска и слить его после каждого прогона?

ответ

0

Я не 100% уверен, что это наиболее эффективный способ, чтобы решить вашу проблему, но я делаю так ...

Поскольку асинхронные сетевые операции может занять разное время, чтобы закончить (или тайм-аут) Я отслеживаю их с переменной экземпляра (в этом случае BOOL называется callComplete)

Когда запускается код для запуска сетевой перезагрузки, а мой 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, я просто создать на старте моего выбора, который выполняется в фоновом режиме. Затем после выполнения Run Loop (и мои вызовы завершены) я возвращаюсь, как обычно, перед возвратом.

+0

У меня есть 7-8 методов (и, возможно, в конечном итоге их больше), которым нужен пул автозапуска на фоновом потоке. Если есть способ настроить его и вытереть из самого цикла запуска (например, как CocoaTouch делает это для основного потока), это определенно было бы предпочтительнее. –

+0

Я думаю, что вы можете использовать наблюдателей цикла цикла, чтобы знать, когда это делается для обработки события. Для получения дополнительной информации просмотрите документы Apple. – InFreefall