Как мне запустить NSRunLoop и убедиться, что у него есть NSAutoreleasePool, который очищается? - PullRequest
1 голос
/ 14 мая 2010

У меня есть задача «синхронизация», которая опирается на несколько «подзадач», которые включают в себя асинхронные сетевые операции, но все они требуют доступа к одной NSManagedObjectContext. Из-за требований потоков NSManagedObjectContext s мне нужно, чтобы каждая из этих подзадач выполнялась в одном потоке. Из-за объема обработки, выполняемой в некоторых из этих задач, мне нужно, чтобы они были в фоновом потоке.

В данный момент я запускаю новый поток, выполняя это в методе -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 для этой темы? Есть ли лучший способ сделать это? Цикл выполнения должен работать только с источниками «executeSelector», и он (и его поток) должен присутствовать в течение всего времени жизни процесса.

Когда дело доходит до настройки NSAutoreleasePool, должен ли я сделать это с помощью Run Loop Observers для создания пула автоматического выпуска и опустошения его после каждого прогона?

Ответы [ 2 ]

0 голосов
/ 14 мая 2010

Что касается NSAutoreleasePool, я просто создаю его в начале моего селектора, который запускается в фоновом режиме. Затем, после того, как цикл выполнения завершен (и мои вызовы завершены), я возвращаюсь как обычно, прежде чем вернуться.

0 голосов
/ 14 мая 2010

Я не уверен на 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
}
...