NSInvocationOperation от запуска от контроллера представления, и контроллер представления расположен? - PullRequest
1 голос
/ 10 февраля 2010

Предположим, я занимаюсь разработкой для iPhone и у меня есть подкласс UIViewController. И предположим, что у этого контроллера представления есть NSOperationQueue, который создан в viewDidLoad и выпущен в dealloc.

Теперь предположим, что в какой-то момент, когда этот контроллер представления активен, он добавляет NSInvocationOperation к NSOperationQueue, и очередь операций начинает выполнять его в фоновом режиме. Пока он выполняется, контроллер представления закрывается.

Что происходит с работающим NSInvocationOperation? Может ли он продолжать работать и не допустить освобождения контроллера представления?

Пример кода в контроллере вида:

NSInvocationOperation *operationDoSomething = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(synchronousDoSomething:) object:nil];
[_operationQueue addOperation:operationDoSomething];
[operationDoSomething release];

а затем это еще одна функция в моем контроллере вида:

- (void)synchronousDoSoemthing
{   
    [NSThread sleepForTimeInterval:1000.0];
    [self finished];
}

Таким образом, в приведенном выше примере к моменту вызова [self finished] контроллер представления отключен от контроллера навигации.

1 Ответ

1 голос
/ 10 февраля 2010

Да, это не хорошо. Так как viewcontrollers - это вещи, которые приходят и уходят, вы не должны позволять им владеть ресурсами, которые занимают потоки и, конечно, не NSOperationQueue.

Лучшим подходом было бы создание некоторого глобального (одноэлементного) объекта, которому принадлежит очередь. Ваш viewconroller может затем зарегистрироваться как наблюдатель, чтобы получать сообщения о выполненных задачах. Или просто прослушайте уведомления, которые отправляет этот глобальный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...