将函数移动到目标c中的后台线程

MoK*_*KaM 27 iphone multithreading background objective-c ios

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

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

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

这是在后台线程上运行泛型函数并将结果返回到UI文本字段.

编辑:

感谢Alladinian它是一种享受.

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

这有什么原因吗?也许背景线程比较慢或什么?

All*_*ian 91

实际上,使用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;
    });
});
Run Code Online (Sandbox Code Playgroud)

有关GCD的更多信息,您可以在此处查看Apple的文档


Tra*_*hor 6

另外,有时你不需要使用GCD,这个使用起来非常简单:

[self performSelectorInBackground:@selector(someMethod:) withObject:nil];
Run Code Online (Sandbox Code Playgroud)

  • 只是一个习惯,f.ex.someMethod可能会在其他地方使用不同的动作调用,所以我通常做 - (void)someMethod:(id)sender; 它只是我的一个习惯,你可以在选择器中轻松做一些方法,如果你想检查发送者或者你传递一个对象,你只需要参数 (4认同)