【问题标题】:Using Blocks and GCD to manage tasks使用 Blocks 和 GCD 管理任务
【发布时间】:2013-09-19 15:51:31
【问题描述】:

我正在学习 iOS,当谈到 GCD 时,我感到很困惑。 让我们把它排除在外,我正在编写一个从互联网获取数据的小程序。 这是我的视图控制器

NSMutableArray dataArray = [NSMutableArray array];

[querysomethingwithblock:(^ {
   //do some stuff here
   [otherquerywithblock:( ^ {
       //do some stuff here
       // Here I got the data from internet
       // Do loop action
       [dataArray addObject:data];
   })];


})];
// here I want to perform some actions only after get data from internet
[self performAction:dataArray];

我怎样才能达到这个目的。实际上,[self performAction:dataArray] 总是在我得到数据之前被解雇。我尝试过使用 GCD,但没有成功。

这是我目前尝试过的一些模式

dispatch_async(queue, ^{
    // Do query stuff here
    dispatch_async(dispatch_get_mainqueue(), ^{
       //perform action here
    });
{;

或使用dispatch_group_asyncdispatch_group_waitdispatch_group_notify

我现在唯一可以处理的方法是使用dispatch_after,但关键是下载时间是可变的,这里有一个特定的时间不是一个好习惯

非常感谢您的建议。

【问题讨论】:

  • 从 otherqueryblock 中调用 performAction !如果您需要在特定线程上,则使用 GCD 或 NSObject -performSelector:onMainThread: ... 中的嵌入方法
  • 对不起伙计,我重新编辑代码以便更好地理解,解释为什么我不能把 `[self performAction:dataArray] 放到那个块中

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


【解决方案1】:

我认为Do query stuff here的代码部分已经是异步的,为什么要把它放在dispatch_queue中呢?

如果您设法进行同步查询,您的代码(第二个 sn-p)将起作用,因为只有在查询完成后才会执行对主队列的调度。

如果您没有以同步方式执行查询的选项,那么您需要一些机制来注册块或回调,以便在下载完成时执行。

归根结底,这完全取决于您在其中有什么样的查询,以及它为您提供了哪些方法来注册下载完成时要执行的操作。

【讨论】:

  • 据我所知,查询块是异步的,你能否给我更多关于实现回调或块来处理这个问题的细节,因为我对 Objective-C 很陌生。我刚刚编辑了我的代码以便更好地理解。我认为我无法获得同步查询,因为它是从 Parse.com API 获取的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多