如何检查一个 dispatch_async 块是否运行完毕

7
基本上,我需要在块执行完毕后运行segue。我有一个执行一些JSON操作的块,我需要知道何时块已经完成运行。
我有一个队列,我称之为json_queue。
jsonQueue = dispatch_queue_create("com.jaboston.jsonQueue", NULL);

我现在有一个dispatch_async块,语法如下:
  dispatch_async(jsonQueue, ^{
  [self doSomeJSON];
  [self performSegueWithIdentifier:@"modaltomenu" sender:self];
  });

无法执行以下代码行:"[self performSegueWithIdentifier:@"modaltomenu" sender:self];"

尝试从主线程或 Web 线程以外的线程获取网络锁。这可能是从辅助线程调用 UIKit 的结果。现在崩溃了...

我应该在哪里检查线程是否完成了它的工作,以便可以调用 segue?

谢谢可爱的人们。

附注:啤酒、UPS、泰迪熊和花朵将送给能够提供帮助的人 <3。

2个回答

27

你应该只在主线程上调用UI方法。尝试在主队列上调度performSegueWithIdentifier:

dispatch_async(jsonQueue, ^{
    [self doSomeJSON];
    dispatch_sync(dispatch_get_main_queue(), ^{
        [self performSegueWithIdentifier:@"modaltomenu" sender:self];
    });
});

您先生已经获得了点赞和啤酒。(这就是我要找的答案!)我完全忘记了您可以在任何时候跳回主队列。太棒了。 - jimbob
我对这个还很陌生。为什么这比在块内使用performSelectorOnMainThread更好? - Nicolas Miari
@jimbob 我应该提到,在第三行中使用 dispatch_sync 而不是 dispatch_async 在这种情况下会更好(我已经进行了编辑)。这种模式在 WWDC2010 Session 206 视频中被推荐使用。 @ranReloaded 使用另一个 block 更方便,因为你不需要为这个简单的任务创建全新的方法,并且更棒的是,你可以访问块定义范围内的每个变量。 - Johnnywho
你永远不应该在主队列上使用dispatch_sync,而是应该使用dispatch_async。否则,你可能会冻结你的用户界面。 - ioskaveen

7
    dispatch_async(jsonQueue, ^{
        [self doSomeJSON];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self performSegueWithIdentifier:@"modaltomenu" sender:self];
           //Finished with async block

        });
    });

我投了赞成票,因为这也是正确的答案,但不幸的是上面那个人回答了一点额外的信息。但非常感谢! - jimbob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接