【问题标题】:moving a function to a background thread in objective c将函数移动到目标c中的后台线程
【发布时间】:2012-10-01 09:54:59
【问题描述】:

我有一个函数可以返回一个字符串,在 iPhone 上计算需要 15 秒。

我希望能够在后台线程上运行该函数,以便主线程可以用于用户界面。

我听说GCD 是一种对此有好处的新技术,有人可以提供一些关于它如何工作的示例代码吗?

即在后台线程上运行一个泛型函数并将结果返回到一个 UI 文本字段。

编辑:

感谢 Alladinian,这是一种享受。

但是,当我使用 GCD 时,我的函数在 iphone 模拟器上执行的时间要长 1 秒(我猜这在 iphone 上大约需要 5 秒(我必须在今天晚些时候对其进行测试才能确定))

这有什么原因吗?可能是后台线程比较慢还是怎么的?

【问题讨论】:

标签: iphone objective-c ios multithreading background


【解决方案1】:

嗯,实际上使用 GCD 很容易。典型的工作流程是这样的:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
    // Perform async operation
    // Call your method/function here
    // Example:
    NSString *result = [anObject calculateSomething];
    dispatch_async(dispatch_get_main_queue(), ^{
        // Update UI
        // Example:
        self.myLabel.text = result;
    });
});

有关 GCD 的更多信息,您可以查看Apple's documentation here

【讨论】:

  • 如果你想 f.ex。只需运行一个更新视图的方法,您也可以执行 [self performSelectorOnMainThread....
  • 感谢 Alladinian,这是一种享受。但是,当我使用 GCD 时,我的函数在 iphone 模拟器上执行的时间要长 1 秒(我猜这在 iphone 上大约需要 5 秒(我必须在今天晚些时候对其进行测试才能确定))有什么原因吗这是为什么?可能是后台线程比较慢还是怎么的?
  • 您可以尝试将优先级设置为更高的级别。试试DISPATCH_QUEUE_PRIORITY_HIGH(而不是DISPATCH_QUEUE_PRIORITY_DEFAULT)。另外不要忘记您会获得响应式 UI 作为回报,所以我想看到一些性能影响是正常的。
  • 真的。 GCD 是否仅适用于双核?因为据我所知,iphone 4 不是双核的,所以也许这对它不起作用?也许我错误地将线程/调度队列与核心混为一谈?
  • GCD 应该可以在任何装有 iOS4+ 的 Apple 设备上正常工作(老实说,我对这些东西也不是很深入。也许这里有人可以解释一下?)
【解决方案2】:

另外补充一下,有时候你不需要用GCD,这个用起来很简单:

[self performSelectorInBackground:@selector(someMethod:) withObject:nil];

【讨论】:

  • 如果你发送一个 nil 作为对象,你为什么要为你的方法定义一个参数? @selector(someMethod) 当你不使用/不想发送参数时更好
  • 只是一种习惯,f.ex。 someMethod 可能会在其他地方用不同的操作调用,所以我通常会这样做 - (void)someMethod:(id)sender;这只是我的一个习惯,你可以很容易地在选择器中做一些方法,如果你想检查发件人或者你传递一个对象,你只需要这个参数
猜你喜欢
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多