如何停止取物?

时间:2014-04-16 07:27:49

标签: ios objective-c asynchronous grand-central-dispatch

我的View中有2个按钮。 fetchstop按钮。当我按fetch按钮时,我的方法获取数据并将其放入textView的文本中。但如果我按stop按钮我想停止提取。我知道我无法停止请求但是当我按下stop按钮时,它不能更改textView的文字。为了更清楚地获取数据,我的程序一定不能回来  这是我的fetch方法:

- (void) pressedFetch
{
    dispatch_async(dispatch_get_main_queue(), ^{
        textView.text = [NSString stringWithFormat:@"%@", [self fetchJson]];
    });
}  

我希望通过类似callBack方法来实现。我怎样才能做到这一点?

4 个答案:

答案 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 = ...
}  

这很容易)))