3

我的 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' 的导航控制器。只有当源控制器由 UINavigationController 的实例管理时,才能使用推送 segue。

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

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

if(!self.navigationController)
    return;

或者...?

谢谢大家!

4

1 回答 1

2
if(!self.navigationController)
    return;

那你试过了吗?一旦你回到主线程,查看界面的状态是完全安全和合理的。

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

于 2013-05-06T14:29:02.313 回答