我如何通过NSURLConnection sendAsynchronousRequest取消asynchronous调用?

我有一个Web服务调用实时validation用户input。 我想在validation(在iOS 5中引入[NSURLConnection sendAsynchronousRequest]上使用[NSURLConnection sendAsynchronousRequest] ,但如果用户同时更改input字段内容,则取消它。 什么是取消当前请求的最佳方法?

似乎没有一个好办法做到这一点。 解决scheme似乎是在您需要取消请求的情况下不使用新的[NSURLConnection sendAsynchronousRequest]

我设法通过将sendAsynchronousRequest方法放在一个单独的DownloadWrapper类中,如下所示:

 // // DownloadWrapper.h // // Created by Ahmed Khalaf on 16/12/11. // Copyright (c) 2011 arkuana. All rights reserved. // #import <Foundation/Foundation.h> @protocol DownloadWrapperDelegate - (void)receivedData:(NSData *)data; - (void)emptyReply; - (void)timedOut; - (void)downloadError:(NSError *)error; @end @interface DownloadWrapper : NSObject { id<DownloadWrapperDelegate> delegate; } @property(nonatomic, retain) id<DownloadWrapperDelegate> delegate; - (void)downloadContentsOfURL:(NSString *)urlString; @end @implementation DownloadWrapper @synthesize delegate; - (void)downloadContentsOfURL:(NSString *)urlString { NSURL *url = [NSURL URLWithString:urlString]; NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:TIMEOUT_INTERVAL]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { if ([data length] > 0 && error == nil) [delegate receivedData:data]; else if ([data length] == 0 && error == nil) [delegate emptyReply]; else if (error != nil && error.code == ERROR_CODE_TIMEOUT) [delegate timedOut]; else if (error != nil) [delegate downloadError:error]; }]; } @end 

为了利用这个类,除了声明DownloadWrapper *downloadWrappervariables(在接口声明中)并实现处理响应或缺less响应的协议方法外,我还做了以下工作:

 NSString *urlString = @"http://yoursite.com/page/to/download.html"; downloadWrapper = [DownloadWrapper alloc]; downloadWrapper.delegate = self; [downloadWrapper downloadContentsOfURL:urlString]; 

然后我简单地做下面的事情,当视图即将消失时,取消连接:

 - (void)viewDidUnload { [super viewDidUnload]; downloadWrapper = nil; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [downloadWrapper setDelegate:nil]; } 

就这么简单。 这将有希望模仿logging的cancel方法,它表明它做了以下几点:

一旦这个方法被调用,接收者的委托将不再接收这个NSURLConnection的消息。

我担心这个(有点天真)的方法意味着数据包仍然会通过响应我们的URL请求 – 只不过是我们不再“倾听”作为代表。 但后来我意识到,一旦URL请求被发送完毕,就没有办法阻止回复给我们 – 我们只能忽略它(如果不是在这个层次上,那么还是在networking层次中的较低层次) 。 如果我错了,请纠正我。

无论哪种方式,希望这有助于。