2016-02-29 38 views
1

我正在使用iOS应用程序,并且正在使用AFnetworking与服务器API进行交互。 我的问题是我想发送电话,并不想限制用户直到从服务器获取响应,所以问题是崩溃。当用户移回特定屏幕时,可以说我有列表屏幕,我正在获取数据,这需要6-7秒,同时用户移回到上一个屏幕,并且数据来自API并将该删除回调到列出屏幕,但用户移动到该屏幕然后应用程序崩溃 下面是获取数据调用的代码。如何停止在目标c中运行队列中发送的呼叫

+ (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查看委托停止呼叫

- (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

什么是崩溃? – Paulw11

+0

将所有操作添加到数组中,并在ViewdidDisappear中的循环彻底数组后停止。 –

+0

@MOHAMMADISHAQ你认为这是最好的办法,也可能是其他操作需要而且重要。 – Aleem

回答

1

我明白了你的观点,我认为问题不在于AFNet工作或下载,而是关于如何组织你的视图控制器。
总之,你需要确保数据和视图的同步。
什么导致你的崩溃是当用户做某些操作时(例如,删除,移动...),数据与视图显示不一样。让我们来回放一个例子:
一个包含12个对象并用表格视图显示的数组。
用户调用web请求来更改数组。我们知道,它需要时间。
用户离开并再次回来。在此视图中,表视图与旧数组一起显示。
此时,Web请求返回。该数组被修改为10个对象。但此时,回调不会导致表视图加载新数据。
当用户进行一些操作时,就像删除表视图中的第11个对象一样。实际上,数组中没有第11个对象。
所以崩溃了。

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

1

首先由

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

去操作对象的引用,然后就可以设置完成块零,当您移动从该屏幕上移开。

[operation setCompletionBlock:nil]; 

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

0

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

我创建单独的类,登记入住公正BOOL,并设置YES默认值,并在那个特定的类和API类- (void)dealloc设置为没有在那里我触发该委托我补充道。

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

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

+0

非常欢迎你@Aleem。 –