在 ios 中取消 NSURLConnection
cancel NSURLConnection in ios
我正在 mapView
drag/regionChange 上调用网络服务。我想在 Web 服务调用中保留一些延迟。所以我希望每当用户多次拖动地图时,所有之前的网络服务调用都应该被取消,只有最后一次拖动的网络服务调用应该被触发。
我该怎么做?
以下是我的代码:
{ .... NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[data length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:data];
[request setHTTPMethod:@"POST"];
NSMutableDictionary __block *dictResponse;
[[NSOperationQueue mainQueue] cancelAllOperations];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if(connectionError == nil){
dictResponse = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&connectionError];
}
不要使用 sendAsynchronousRequest
便利 API,使用主委托 API 这样你就可以访问 NSURLConnecyion
的实例来调用 cancel
上。
另外,不要在主队列上取消操作,你不知道那里有什么,可以考虑使用NSURLSession
您无法取消 sendAsynchronousRequest
。如果您使用基于委托的 NSURLConnection
请求,那么您可以取消它,但是 (a) 这比您可能想要打扰的编码要多; (b) NSURLConnection
已被弃用,所以无论如何你都应该是 NSURLSession
; (c) NSURLSession
允许您使用返回给您的 NSURLSessionTask
参考取消任务:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setHTTPBody:data];
[request setHTTPMethod:@"POST"];
NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"connection error = %@", error);
return;
}
NSError *parseError;
NSDictionary *responseObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&parseError];
if (!responseObject) {
NSLog(@"parse error = %@", parseError);
}
dispatch_async(dispatch_get_main_queue(), ^{
// use response here; e.g., updating UI or model objects
});
}];
[task resume];
如果您需要取消此请求,只需调用[task cancel]
。因此,如果您想跟踪它并在以后取消它,请将此 NSURLSessionTask
保存在某个弱变量中。
我正在 mapView
drag/regionChange 上调用网络服务。我想在 Web 服务调用中保留一些延迟。所以我希望每当用户多次拖动地图时,所有之前的网络服务调用都应该被取消,只有最后一次拖动的网络服务调用应该被触发。
我该怎么做?
以下是我的代码:
{ .... NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[data length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:data];
[request setHTTPMethod:@"POST"];
NSMutableDictionary __block *dictResponse;
[[NSOperationQueue mainQueue] cancelAllOperations];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if(connectionError == nil){
dictResponse = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&connectionError];
}
不要使用 sendAsynchronousRequest
便利 API,使用主委托 API 这样你就可以访问 NSURLConnecyion
的实例来调用 cancel
上。
另外,不要在主队列上取消操作,你不知道那里有什么,可以考虑使用NSURLSession
您无法取消 sendAsynchronousRequest
。如果您使用基于委托的 NSURLConnection
请求,那么您可以取消它,但是 (a) 这比您可能想要打扰的编码要多; (b) NSURLConnection
已被弃用,所以无论如何你都应该是 NSURLSession
; (c) NSURLSession
允许您使用返回给您的 NSURLSessionTask
参考取消任务:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setHTTPBody:data];
[request setHTTPMethod:@"POST"];
NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"connection error = %@", error);
return;
}
NSError *parseError;
NSDictionary *responseObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&parseError];
if (!responseObject) {
NSLog(@"parse error = %@", parseError);
}
dispatch_async(dispatch_get_main_queue(), ^{
// use response here; e.g., updating UI or model objects
});
}];
[task resume];
如果您需要取消此请求,只需调用[task cancel]
。因此,如果您想跟踪它并在以后取消它,请将此 NSURLSessionTask
保存在某个弱变量中。