1

我正在我的应用程序中处理网络请求,并在 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];

refreshPostsInPart:DataController 的方法中,我使用 while 循环对来自 App.net 的分页数据进行重复的网络请求。在循环的每次迭代中,我都会检查 DataController 的属性self.isCancelled(类型为 BOOL),如果是,NO我会继续发出请求。

在我dealloc的 DataController 方法中,我将此属性设置为YES,以便在 while 循环的下一次迭代中,我将停止发出请求。从本质上讲,我cancelAllOperations在使用 NSBlockOperation 时实现了一个穷人。

问题:self.isCancelledNO我的 dealloc 方法中设置为时,我是否也设置self.isCancelled了块中正在使用的 strongSelf 引用?

4

1 回答 1

2

self, weakSelf, 和strongSelf都指向内存中的同一个对象。这意味着,如果您向selfin发送消息dealloc(您通过设置该属性来执行此操作),weakSelf并且strongSelf还“了解”此更新的属性。所以,是的,您也正在设置self.isCancelled(很可能实际属性的名称是self.cancelled,它的吸气剂是isCancelledstrongSelf

于 2014-02-21T23:58:54.727 回答