【问题标题】:Returning to a thread with GCD from a delegate从委托返回到带有 GCD 的线程
【发布时间】:2014-05-02 09:48:16
【问题描述】:

我们正在实施一个同步系统,其中一些操作异步发送到 SAP Mobile Platform 服务器,当操作完成时,我们会收到来自专有 SDK 的委托调用。

此委托方法在随机线程上运行,不使用 GCD。

我们希望发送操作 - 然后等到调用委托方法,这意味着操作完成 - 然后在完成(或发生超时)时恢复工作。我知道这可能看起来是同步的,但我们不能允许用户在操作尚未完成时修改数据以确保数据完整性。

Sync ViewController 正在执行一些繁重的同步工作并使用 GCD,并在 UI 线程中更新进度条和一些文本。

现在,当调用委托方法时,我们想调用 Sync ViewController 上的另一个方法,但是这个调用显然是在错误的线程中完成的。

我的问题是如何在调用委托之前 GCD 正在执行它们的同一线程中执行这些方法。

我们尝试过的事情:

  1. 只是调用方法。然后这些方法在错误的线程中被调用,也就是委托方法所在的线程。
  2. 在所选线程上发布通知,我们不知道 Sync ViewController 正在工作的确切线程。

有什么想法吗?

【问题讨论】:

  • 可能你只需要主线程?然后你可以在dispatch_asynch 中路径dispatch_get_main_queue()

标签: ios objective-c multithreading delegates


【解决方案1】:

如果您已经在使用 GCD,那么您必须知道正在执行这项工作的调度队列,所以这不仅仅是在 上以同步或异步方式调度一个块的情况> 排队?

- (void)someDelegateMethod:(id)someValue {
    dispatch_async(self.myDispatchQueue, ^{
        [self doInterestingThingWith:someValue];
    });
}

【讨论】:

  • 这确实有效。我认为您不应该将队列与线程混淆,所以我不确定这个解决方案是否真的可靠,但在我的几个测试用例中,这总是给出正确的结果。谢谢!
  • @GlennV,您应该忘记线程并在队列范式中开发。有来自 Apple 的Migrating Away From Threads 指南
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多