我正在我的应用程序中进行网络请求,并且正在使用NSOperationQueue中的NSBlockOperations异步执行此操作。但是,如果取消分配调用它们的视图控制器(已从导航堆栈中弹出),我希望能够取消这些操作。
这是我所拥有的简化版本:
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];
在DataController的refreshPostsInPart:
方法中,我使用while循环对来自App.net的分页数据进行重复的网络请求。在循环的每次迭代中,我检查DataController self.isCancelled
(BOOL类型)的属性,如果它是NO
我继续发出请求。
在我的dealloc
DataController方法中,我将此属性设置为YES
,以便在while循环的下一次迭代中,我将停止发出请求。从本质上讲,我在使用NSBlockOperation时实现了一个可怜的勒芒cancelAllOperations
。
问题:在我的dealloc方法中将self.isCancelled
设置为NO
时,我是否还为块中使用的strongSelf引用设置了self.isCancelled
?
答案 0 :(得分:2)
self
,weakSelf
和strongSelf
都指向内存中的同一个对象。这意味着,如果您向self
中的dealloc
发送邮件(通过设置该属性即可),weakSelf
和strongSelf
也“了解”此更新后的媒体资源。所以,是的,您在self.isCancelled
上设置self.cancelled
(实际属性名称isCancelled
,其吸气者strongSelf
)也是如此。