AFNetworking 问题 - 关闭视图控制器时取消操作

AFNetworking Issue - Cancel Operation when dismissing view controller

我在发出异步 GET 请求时关闭视图控制器时发生崩溃。我试图做的是结束 viewWillDissapear 中的所有操作,但我仍然遇到崩溃。任何想法解决这个问题是什么?

-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [[AFHTTPRequestOperationManager manager].operationQueue cancelAllOperations];
}




AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:path parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSMutableArray *responseArray = [responseObject mutableCopy];
    NSMutableIndexSet *indexesToDelete = [NSMutableIndexSet indexSet];
    NSUInteger currentIndex = 0;
    for (NSDictionary *track in responseArray) {
        if ([track objectForKey:@"streamable"] == [NSNumber numberWithBool:false]) {
            [indexesToDelete addIndex:currentIndex];
        }
        currentIndex++;
    }
    [responseArray removeObjectsAtIndexes:indexesToDelete];
    completion((NSArray *) responseArray, (BOOL) NO);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
    completion((NSArray *) nil, (BOOL) YES);
    [[NSNotificationCenter defaultCenter]postNotificationName:@"networkError" object:nil];
}];

避免这种崩溃的一个好习惯是将数据与视图控制器分开。基本上你会有数据管理器来保存数据,这将是一个将在整个应用程序会话中存在的单例。视图控制器将从该数据管理器读取数据,如果不可用,将通过 DataMgr 发出 Http 请求,DataMgr 将接收响应。收到响应后,DataMgr 将发送通知以更新视图控制器的 UI 仍然可用。

此模式可帮助您避免崩溃,并将所有数据组织在一个地方。并且还拒绝往返服务器,这也节省了设备上的电池。

在您的代码中,我注意到您正在取消所有请求,不建议这样做。您应该在那里做的是停止所有通知侦听器,并在加载视图时注册侦听器。

现在,如果您可以共享更多的代码并且可能会出现新的崩溃,我可以准确地告诉您出了什么问题。将 Blocks 与 __weak 一起使用,google more in this 以获得更多信息。

当您取消操作时,将调用 failure 块,因此无论您使用

做什么
completion((NSArray *) nil, (BOOL) YES);
[[NSNotificationCenter defaultCenter]postNotificationName:@"networkError" object:nil];

是导致崩溃的原因。