Изменение значения @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
также.