在Objective-C中将函数移动到后台线程

36

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

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

我听说是一种新技术,非常适合这种情况,请问有人能提供一些关于如何使用该技术的示例代码吗?

即在后台线程上运行一个通用函数,并将结果返回给UI文本字段。

编辑:

谢谢Alladinian,它确实很有效。

然而,当我使用GCD时,我的函数在iphone模拟器上需要多1秒钟才能执行(我猜这可能需要大约5秒钟在iphone上(我必须今天晚些时候测试一下才能确定))。

这是为什么呢?也许后台线程速度较慢之类的原因吗?


也许http://nachbaur.com/blog/using-gcd-and-blocks-effectively是一个很好的入门方式,GCD非常强大,特别是与blocks一起使用。 - Jelle De Laender
2个回答

103

使用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的内容,你可以参考 苹果官方文档


如果你想运行一个更新视图的方法,你也可以使用[self performSelectorOnMainThread...]。 - Trausti Thor
谢谢Alladinian,它运行得很好。然而,当我使用GCD时,在iPhone模拟器上执行我的函数需要多1秒钟(我猜这在iPhone上大约是5秒钟(我必须今天晚些时候测试一下才能确定))这是为什么呢?也许后台线程比较慢之类的原因吗? - MoKaM
你可以尝试将优先级设置为更高的级别。尝试使用 DISPATCH_QUEUE_PRIORITY_HIGH(而不是 DISPATCH_QUEUE_PRIORITY_DEFAULT)。同时,不要忘记你会得到一个响应灵敏的用户界面,所以我想看到一些性能影响是正常的。 - Alladinian
GCD应该在任何搭载iOS4+的苹果设备上都能正常工作(说实话,我对这方面也不是很了解。也许这里有人可以解释一下?) - Alladinian
谢谢这个。 这是一个很好的工作示例代码块,用于将任务分派到后台线程。 我的GCD知识并不是很强,当我尝试放置耗时的for循环以提取数据并设置字典时,会崩溃并显示“释放的指针未分配”。使用这个示例后,现在正常工作了。 - Glenn Posadas
显示剩余2条评论

9
此外,有时候您不需要使用GCD,以下方法非常简单易用:
[self performSelectorInBackground:@selector(someMethod:) withObject:nil];

1
如果您将nil作为对象发送,为什么要在方法中定义一个参数?当您不使用/不想发送参数时,@selector(someMethod)更好。 - Jelle De Laender
5
只是一种习惯,例如,有些地方可能会调用someMethod来执行不同的操作,因此我通常会这样写-(void)someMethod:(id)sender; 这只是我的一个习惯,你也可以轻松地在选择器中只写someMethod,只有在你想要检查发送者或者传递对象时才需要使用参数。 - Trausti Thor

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