Изменение значения @property для self при выполнении блока, который использует строгую ссылку на self

Я работаю над выполнением сетевых запросов в своем приложении и использую NSBlockOperations в NSOperationQueue, чтобы сделать это асинхронно. Однако я хочу иметь возможность отменить эти операции, если контроллер представления, вызвавший их, освобожден (удален из стека навигации).

Это упрощенная версия того, что у меня есть:

NSArray *posts;

__weak DataController *weakSelf = self;
NSBlockOperation *fetchPostsOperation = [NSBlockOperation blockOperationWithBlock:^{
    DataController *strongSelf = weakSelf;
    NSDictionary *response = [weakSelf refreshPostsInPart:PartFirst];
    posts = [response objectForKey:@"posts"];
}];

[self.queue addOperation:fetchPostsOperation];

в refreshPostsInPart: Метод DataController Я делаю повторные сетевые запросы для разбитых на страницы данных из App.net, используя цикл while. На каждой итерации цикла я проверяю свойство DataController self.isCancelled (типа BOOL), если это NO Я продолжаю делать запросы.

В моем dealloc Метод DataController Я установил это свойство, чтобы YES так что на следующей итерации цикла while я перестану делать запросы. По сути, я реализую бедняков cancelAllOperations при использовании NSBlockOperation.

Вопрос: при настройке self.isCancelled в NO в моем методе dealloc, я также устанавливаю self.isCancelled для ссылки на strongSelf, которая используется в блоке?

1 ответ

Решение

self, weakSelf, а также strongSelf все ссылаются на один и тот же объект в памяти. Это означает, что если вы отправите сообщение self в dealloc (что вы делаете, устанавливая это свойство), weakSelf а также strongSelf также "знать" об этом обновленном свойстве. Итак, да, вы устанавливаете self.isCancelled (более чем вероятно, фактическое имя свойства self.cancelled и его добытчик isCancelled) на strongSelf также.

Другие вопросы по тегам