我正在开发iOS App,我正在使用AFNetworking与服务器API进行交互。 我的问题是我想发送呼叫,并且在响应从服务器获取之前不想限制用户,因此问题是崩溃。当用户移回到那个特定的屏幕时,我可以说我有一个列表屏幕,我正在获取数据需要6-7秒,同时用户返回到前一个屏幕,当数据来自API并回调该删除到列表屏幕但用户移动到该屏幕然后应用程序崩溃 以下是获取数据调用的代码。
+ (void) getRequestForDocumentListing:(NSDictionary *)headerParams urlQuery: (NSString*)action parameters:(NSDictionary*)params
onComplete:(void (^)(id json, id code))successBlock
onError:(void (^)(id error, id code))errorBlock
{
NSString *authorizationValue = [self setAuthorizationValue:action];
NSString *selectedLanguage = [ApplicationBaseViewController getDataFromDefaults:@"GLOBALLOCALE"];
NSString *language = selectedLanguage;
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//set headers values
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager.requestSerializer setValue:language forHTTPHeaderField:@"Accept-Language"];
[manager.requestSerializer setValue:authorizationValue forHTTPHeaderField:@"authorization"];
[manager.requestSerializer setValue:@"x-folder" forHTTPHeaderField:@"inbox"];
[manager GET:action parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"document listing success");
NSInteger statusCode = [operation.response statusCode];
NSNumber *statusObject = [NSNumber numberWithInteger:statusCode];
successBlock(responseObject, statusObject);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSInteger statusCode = [operation.response statusCode];
NSNumber *statusObject = [NSNumber numberWithInteger:statusCode];
id responseObject = operation.responseData;
id json = nil;
id errorMessage = nil;
if (responseObject) {
json = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:&error];
errorMessage = [(NSDictionary*)json objectForKey:@"Message"];
}else{
json = [error.userInfo objectForKey:NSLocalizedDescriptionKey];
errorMessage = json;
}
errorBlock(errorMessage, statusObject);
}];
}
我需要的是在ViewdidDisappear View委托中停止呼叫
- (AFHTTPRequestOperation *)GET:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"GET" URLString:URLString parameters:parameters success:success failure:failure];
[self.operationQueue addOperation:operation];
return operation;
}
如何解决这个特殊问题?
答案 0 :(得分:1)
我明白了,我认为问题不在于AFNetWorking或下载,而是在于如何组织视图控制器。
简而言之,您需要确保数据和视图的同步。
导致崩溃的原因是当用户进行某些操作(例如删除,移动......)时,数据与视图显示的数据不同。
让我们回顾一个例子:
一个包含12个对象的数组,并以表格视图显示它
用户调用Web请求来更改阵列。我们知道,这需要时间
用户离开并再次回来。在此视图中,表视图显示旧数组
此时,Web请求返回。数组被修改为10个对象。但此时,回调不会导致表视图加载新数据。
当用户执行某些操作时,就像删除表视图中的第11个对象一样。实际上,数组中没有第11个对象
崩溃来了。
如何处理它是为了保持数据和视图的同步。
答案 1 :(得分:1)
首先通过
获取对Operation对象的引用AFHTTPRequestOperation *operation = [manager GET:action parameters:nil success:^...blah blah blah...];
然后,当您离开此屏幕时,您可以将完成块设置为nil。
[operation setCompletionBlock:nil];
请注意,即使您离开屏幕,请求也可能实际成功执行。但是,您的应用程序现在不会崩溃。
答案 2 :(得分:0)
感谢RuchiraRandana和childrenOurFuture的答案,我从你的答案得到了帮助,最后我来解决方案,我不打算取消操作并设置nil委托,因为我的其他操作也在工作,这是在其他屏幕上触发
我在单例类中创建了一个公正的BOOL
并设置了YES
默认值,并且在- (void)dealloc
的特定类和API类中设置为no,我触发了该委托我补充说,检查。
if ([SHAppSingleton sharedInstance].isDocListControllerPop == YES) {
[delegate documentListResponse:documentList andStatusCode:code];
}
我知道这可能不是完美的解决方案,但这解决了我的问题。 谢谢