我的View
中有2个按钮。 fetch
和stop
按钮。当我按fetch
按钮时,我的方法获取数据并将其放入textView
的文本中。但如果我按stop
按钮我想停止提取。我知道我无法停止请求但是当我按下stop
按钮时,它不能更改textView
的文字。为了更清楚地获取数据,我的程序一定不能回来
这是我的fetch
方法:
- (void) pressedFetch
{
dispatch_async(dispatch_get_main_queue(), ^{
textView.text = [NSString stringWithFormat:@"%@", [self fetchJson]];
});
}
我希望通过类似callBack
方法来实现。我怎样才能做到这一点?
答案 0 :(得分:2)
请勿使用GCD,请使用提供取消支持的更高级NSOperation
API。在您的操作子类中,您可以在使用下载的数据之前检查要取消的操作。要取消,请使用操作队列cancelAllOperations
方法。
您的操作可以是NSBlockOperation
的实例,并假设fetchJson
是同步的,例如:
NSOperation *op = [NSBlockOperation blockOperationWithBlock:^{
id json = [self fetchJson];
if (![self isCancelled]) {
dispatch_async(dispatch_get_main_queue(), ^{
textView.text = [NSString stringWithFormat:@"%@", json];
});
}
}];
答案 1 :(得分:1)
如果您不想在点按“停止”按钮时显示所提取的数据,
- (IBAction)stop:(id)sender
{
textView.text = @""
}
或者如果您使用NSURLConnection从服务器获取数据,则可以在其上调用Cancel
- (IBAction)stop:(id)sender
{
[urlConnection cancel]; // NSURLConnection *connection;
/* After this method is called, the connection’s delegate no longer receives any messages for the connection. If you want to reattempt the connection, you should create a new connection object.*/
}
答案 2 :(得分:0)
首先,你必须检查你班上已经下载过的数据。 如果不是,您可以下载数据并通过文档目录中的存档存储在文件中,然后检查文档目录中的文件,并取消存档您的数据并使用它。
答案 3 :(得分:0)
其实这是错误的方式。我改变了我的方法。我用NSURLSession
做到了。它有一个名为invalidateAndCancel
的方法。如果我使用此方法,我的session
将被取消,fetching
将被停用。
- (void) pressedFetch
{
NSString *jsonUrl = @"http://api.geonames.org/postalCodeLookupJSON?postalcode=6600&country=AT&username=demo";
NSURL *url = [NSURL URLWithString:str];
NSURLSessionConfiguration *conf = [NSURLSessionConfiguration ephemeralSessionConfiguration];
session = [NSURLSession
sessionWithConfiguration:conf
delegate:self
delegateQueue:[NSOperationQueue mainQueue]];
task = [session downloadTaskWithRequest:request]; //NSURLSessionDownloadTask *task = ...
[task resume];
}
- (void) pressedStop
{
[session invalidateAndCancel]; //NSURLSession *session = ...
}
这很容易)))