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

问题描述 投票:1回答:3

我正在使用iOS App,我正在使用AFNetworking与服务器API进行交互。我的问题是我想发送呼叫,并且在响应从服务器获取之前不想限制用户,因此问题是崩溃。当用户移回到那个特定的屏幕时,我可以说我有一个列表屏幕,我正在获取数据需要6-7秒,同时用户返回到前一个屏幕,当数据来自API并回调该删除到列表屏幕但用户移动到该屏幕然后App崩溃下面是获取数据调用的代码。

+ (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;
}

如何解决这个特殊问题?

ios objective-c xcode api afnetworking
3个回答
1
投票

我明白了你的观点,我认为问题不在于AFNetWorking或下载,而在于你如何组织视图控制器。 简而言之,您需要确保数据和视图的同步。 导致崩溃的原因是当用户进行某些操作(例如删除,移动......)时,数据与视图显示的数据不同。

让我们回顾一个例子: 一个包含12个对象的数组,并以表格视图显示它。 用户调用Web请求来更改阵列。我们知道,这需要时间。 用户离开并再次回来。在此视图中,表视图显示旧数组。 此时,Web请求返回。该数组被修改为10个对象。但此时,回调剂量不会导致表视图加载新数据。 当用户执行某些操作时,就像删除表视图中的第11个对象一样。实际上,数组中没有第11个对象。 崩溃来了。

如何处理它是保持数据和视图的同步。


1
投票

首先获取对Operation对象的引用

AFHTTPRequestOperation *operation = [manager GET:action parameters:nil success:^...blah blah blah...];

然后,当您离开此屏幕时,可以将完成块设置为nil。

[operation setCompletionBlock:nil];

请注意,即使您离开屏幕,请求也可能实际成功执行。但是,您的应用程序现在不会崩溃。


0
投票

感谢RuchiraRandana和childrenOurFuture的答案,我从你的答案得到了帮助,最后我来解决方案,我不打算取消操作并设置nil委托,因为我的其他操作也在工作,这是在其他屏幕上触发。

我在单例类中创建了一个正确的BOOL并设置了YES默认值,并且在该特定类的- (void)dealloc中设置为no,并且在我触发该委托的API类中我添加了该检查。

if ([SHAppSingleton sharedInstance].isDocListControllerPop == YES) {
         [delegate documentListResponse:documentList andStatusCode:code];
     }

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

© www.soinside.com 2019 - 2024. All rights reserved.