在执行使用对self的强引用的块时更改self的@property值

时间:2014-02-21 23:49:09

标签: ios asynchronous objective-c-blocks nsblockoperation strong-references

我正在我的应用程序中进行网络请求,并且正在使用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

1 个答案:

答案 0 :(得分:2)

selfweakSelfstrongSelf都指向内存中的同一个对象。这意味着,如果您向self中的dealloc发送邮件(通过设置该属性即可),weakSelfstrongSelf也“了解”此更新后的媒体资源。所以,是的,您在self.isCancelled上设置self.cancelled(实际属性名称isCancelled,其吸气者strongSelf)也是如此。