导航回来时取消GCD异步任务

时间:2013-05-06 13:53:07

标签: ios asynchronous uinavigationcontroller block grand-central-dispatch

我的iOS应用中的视图控制器中有一个相对较长的运行任务(5-10秒)。它在后台由GCD运行异步。用户可以在此任务期间进行UI操作,因此他还可以按后退按钮导航到上一个视图。

我的代码很简单:

dispatch_queue_t queue = dispatch_queue_create("com.x.y.z", NULL);
dispatch_async(queue, ^{
    TestObject* test = [self getTestObject];
    dispatch_async(dispatch_get_main_queue(), ^{
        test.resultset.count > 0 ? 
             [self performSegueWithIdentifier:@"xy" sender:self] :
             [UIUtils showSimpleAlert:NSLocalizedString(@"NoDataForInterval",nil) 
                             delegate:self];
    });
});

异常信息:因未捕获的异常NSGenericException而终止应用,原因:

  

找不到segue'xy'的导航控制器。 Push segues只能在源控制器由UINavigationController实例管理时使用。

所以,问题是,当我的用户返回上一个视图时,GCD中的任务会继续,完成时会崩溃我的应用程序,因为无法执行我的segue。

所以,我的问题是:当导航到另一个视图时,如何在GCD中取消我的asny任务?或者只是简单地在完成时以某种方式测试当前视图,例如

if(!self.navigationController)
    return;

还是...?

谢谢大家!

1 个答案:

答案 0 :(得分:2)

if(!self.navigationController)
    return;

你也尝试过吗?一旦你回到主线程,看看界面的状态是非常安全和合理的。

另一方面,如果您真的希望在中间轻松取消冗长的任务,请使用NSOperation而不是GCD块。这为您提供了一个线程安全的取消API。