2013-11-22 82 views
36

我將我的網絡功能從AFNetworking遷移到AFNetworking v2,而不是AFHttpClient我使用AFHTTPRequestOperationManager來支持iOS6。AFNetworking 2:如何取消AFHTTPRequestOperationManager請求?

我的問題是,雖然在AFHttpClient有功能使用

- (void)cancelAllHTTPOperationsWithMethod:(NSString *)method path:(NSString *)path; 

方法,在AFHTTPRequestOperationManager沒有這樣明顯的方法取消掛起的請求。

我所做的到現在是繼承AFHTTPRequestOperationManager並宣佈伊娃

AFHTTPRequestOperation *_currentRequest; 

當我提出請求的代碼是一樣的東西

- (void)GetSomething:(NSInteger)ID success:(void (^)(MyResponse *))success failure:(void (^)(NSError *))failure 
{ 
    _currentRequest = [self GET:@"api/something" parameters:@{@"ID": [NSNumber numberWithInteger:ID]} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     MyResponse *response = [MyResponse responseFromDictionary:responseObject]; 
     success(response); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     failure(error); 

    }]; 
} 

,我有一個

- (void)cancelCurrentRequest; 

所有的方法是

- (void)cancelCurrentRequest 
{ 
    if(_currentRequest) { 
     [_currentRequest cancel]; _currentRequest = nil; 
    } 
} 

現在,我不認爲這是很好的做法,當調用方法時,我得到(NSURLErrorDomain error -999.)這就是爲什麼我需要得到這個正確做了一些建議。

預先感謝您。

回答

79
[manager.operationQueue cancelAllOperations]; 
+3

Thx的答案。我注意到了,但是如果你想取消一個特定的GET/POST請求呢? – ozzotto

+3

如果你看看cancelAllHTTPOperationsWithMethod:路徑的實現,你會發現如何去做。它只是迭代operationQueue中的所有操作以找到與方法和路徑匹配並取消它們的操作。他們在v2中刪除它們的原因我猜他們認爲沒有必要取消特定的操作? –

+0

這就是我最終做的。在我的AFHTTPRequestOperationManager子類中實現cancelAllHTTPOperationsWithMethod:路徑。 Thx隊友。 – ozzotto

2

您不必繼承AFHTTPRequestOperationManager,因爲當你發送請求,從

- (AFHTTPRequestOperation *)GET:(NSString *)URLString 
        parameters:(id)parameters 
         success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
         failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure 

AFHTTPRequestOperation回報只是保存在某個地方,或使靜態的,然後執行cancel時要求必須是取消。

實施例:

- (void)sendRequestToDoSomething 
{ 
    static AFHTTPRequestOperation *operation; 
    if(operation) //cancel operation if it is running 
     [operation cancel]; 
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    //configure manager here.... 

operation = [manager GET:urlString parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    //do something here with the response 
    operation = nil; 
} failure:^(AFHTTPRequestOperation *op, NSError *error) { 
{ 
    //handle error 
    operation = nil; 
}