cancel NSURLConnection in ios

后端 未结 2 691
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-21 19:59

I am calling webservice on mapView drag/regionChange. I want to keep some delay in the web service calls. So I want that whenever the user drags the map multipl

相关标签:
2条回答
  • 2020-12-21 20:30

    You cannot cancel a sendAsynchronousRequest. If you used a delegate-based NSURLConnection request, then you could cancel it, but (a) that's more coding than you probably want to bother with; (b) NSURLConnection is deprecated, so you should be NSURLSession anyway; and (c) NSURLSession allows you to cancel the task using the NSURLSessionTask reference that is returned to you:

    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];
    

    If you need to cancel this request, just call [task cancel]. So save this NSURLSessionTask in some weak variable if you want to keep track of it and cancel it later.

    0 讨论(0)
  • 2020-12-21 20:39

    Don't use the sendAsynchronousRequest convenience API, use the main delegate API so you have access to the instance of NSURLConnecyion to call cancel on.

    Also, don't cancel operations on the main queue, you don't know what's there, and consider using NSURLSession

    0 讨论(0)
提交回复
热议问题