我正在我的应用程序中处理网络请求,并在 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.isCancelled
在NO
我的 dealloc 方法中设置为时,我是否也设置self.isCancelled
了块中正在使用的 strongSelf 引用?