在发出异步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];
}];
答案 0 :(得分:0)
避免此类崩溃的一个好方法是将数据与View控制器分开。基本上你会有数据管理器来保存数据,这将是一个将用于整个应用程序会话的单例。视图控制器将从此数据管理器读取数据,如果不可用,将通过DataMgr发出Http请求,并且DataMgr将接收响应。收到响应后,DataMgr将发送通知以更新视图控制器的UI仍然可用。
此模式可帮助您摆脱崩溃,并在一个地方整理所有数据。并且还拒绝了到服务器的往返行程,也节省了设备上的电池。
在您的代码中,我注意到您要取消所有请求,并且不建议这样做。您应该在那里做的是停止所有通知侦听器,并在视图加载时注册侦听器。
目前,如果您可以分享更多的代码并且崩溃可能是新的,我可以准确地说出出了什么问题。使用带有__weak的块,在此处使用google以获取更多信息。
答案 1 :(得分:0)
当你取消操作时,会调用failure
块,所以无论你做什么
completion((NSArray *) nil, (BOOL) YES);
[[NSNotificationCenter defaultCenter]postNotificationName:@"networkError" object:nil];
是导致您崩溃的原因。