0

我知道,这个问题以前问过。但不适合我这种情况。我正在为转移层AFNetworking工作。我的代码如下。AFNetworking取消帖子请求

AFHTTPRequestOperation * post; AFHTTPRequestOperationManager * manager;


AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager]; 
    NSMutableDictionary *paramDict = [[NSMutableDictionary alloc] init] ; 

    delegate = (id<ConnectionUtilDelegate>) delegateObject; 

    for (Parameter *param in parameterArray) 
    { 
     [paramDict setObject:param.value forKey:param.name]; 
    } 
    NSDictionary *params = paramDict; 
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 
    [manager.operationQueue cancelAllOperations]; 
    post = [manager POST:[NSString stringWithFormat:@"%@",url] parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"JSON: %@", responseObject); 
     [delegate requestCompleted:responseObject]; 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     [delegate requestFailed:error]; 
     NSLog(@"Error: %@", error); 
    }]; 

这是我的职务的请求。它像魅力一样工作。但有时候一些请求可能会迟到。例如,我发送2个不同的帖子请求这个名字P1(Post 1)和P2(Post 2)。如果这些请求响应返回为R1(响应1)并且比R2(响应2)对我来说可以。但是,如果这个请求响应作为R2(响应2)而不是R1(响应1)返回,那么它是我的应用程序的一个原因。所以我想在发送新请求时取消旧请求。和

[post cancel];

错误: [AFHTTPRequestOperation取消]:发送到释放实例消息0x1723cbf0

不是为我工作。你有什么建议吗?

回答

1

正如我在你的代码中看到,您为每个请求创建一个新的AFHTTPRequestOperationManager实例,然后在新创建的AFHTTPRequestOperationManager执行operationQueue cancelAllOperations。我建议你创建AFHTTPRequestOperationManager类型的sharedManager和使用的所有请求此单对象:

+ (instancetype)sharedManager { 
    static AFHTTPRequestOperationManager *instance; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     instance = [AFHTTPRequestOperationManager manager]; 
    }); 
    return instance; 
} 

然后,您可以执行使用一个新的请求前取消所有请求:

+ (void)cancelAllRequests { 
    [[AFHTTPRequestOperationManager sharedManager].operationQueue cancelAllOperations]; 
} 

当您打电话上述方法中,所有请求都将失败,并调用failure块。所以你需要检查在故障块中的操作是否为cancelled。最终代码如下:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager sharedManager]; 
NSMutableDictionary *paramDict = [[NSMutableDictionary alloc] init] ; 


delegate = (id<ConnectionUtilDelegate>) delegateObject; 

for (Parameter *param in parameterArray) 
{ 
    [paramDict setObject:param.value forKey:param.name]; 
} 
NSDictionary *params = paramDict; 

manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

AFHTTPRequestOperation *post = [manager POST:[NSString stringWithFormat:@"%@",url] parameters:params 

success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     [delegate requestCompleted:responseObject]; 

} 
failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    if (!operation.cancelled) { 
     [delegate requestFailed:error]; 
    } 
}]; 

[post start]; 
+0

泰克斯男人,它的工作就像一个魅力+1 :) –

+0

不客气:) –