如何停止在Objective-C中的操作队列中发送的调用

时间:2016-02-29 07:15:29

标签: ios objective-c xcode api afnetworking

我正在开发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;
}

如何解决这个特殊问题?

3 个答案:

答案 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];
     }

我知道这可能不是完美的解决方案,但这解决了我的问题。 谢谢