Objective-C中的线程处理

10

Objective C中有线程吗?如果有,它们如何声明和使用?

如果有人了解Objective C中的多线程,请与我分享。

谢谢和问候。

5个回答

18

想要在新线程中简单地调用一个方法,可以使用 NSThread 上的 + (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument 方法。如果你不是在运行垃圾回收程序,则需要设置自己的自动释放池。

如果你只是不想阻塞主线程,那么另一种简单的方法是使用 NSObject 上的 - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg 方法。

根据你需要的并发类型,还应该查看 NSOperation,它可以免费提供锁定以便你可以在多个线程之间共享等等功能。


11
如果你正在使用Cocoa(例如用于Mac或iPhone开发),则可以使用NSThread类进行多线程开发。搜索NSThread将会帮助你找到相关的API。
你可以使用以下方式声明:
NSThread *mythread = [[NSThread alloc] initWithTarget:target selector:selector object:argument];

其中target和selector是您想要启动线程的对象和选择器,而argument是要发送到选择器的参数。

然后使用[mythread start]来启动它。


10

是的,在Objective C中存在线程概念。而且有多种方法可以实现Objective C中的多线程。

1> NSThread

[NSThread detachNewThreadSelector:@selector(startTheBackgroundJob) toTarget:self withObject:nil];  

这将在你的主线程中创建一个新的后台线程。

2> 使用 performSelector

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];

如果您从后台线程调用此方法,将在主线程上执行UI任务... 您还可以使用

[self performSelectorInBackground:@selector(abc:) withObject:obj];

这将创建一个后台线程。

3> 使用NSOperation

点击此链接

4> 使用GCD

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self callWebService];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self updateUI];
        });
    });

将在后台线程中调用 callWebService 方法,并在完成后在主线程中更新UI。了解更多关于GCD的内容

这几乎是iOS中使用的所有多线程方式。希望这可以帮到你。


3

NSOperation仅支持iOS 4.0或更高版本。 - asedra_le

2
在涉及detachNewThreadSelector:等操作之前,请务必查看苹果公司的官方文档。对于高级选项(包括操作队列,调度队列等),有并发编程指南提供概述。而对于更低级别(不建议使用)的线程处理,可以参考多线程编程指南
在没有阅读苹果公司的相关内容之前,绝对不要轻易启动线程。他们已经做了很多工作,如GCD,使编写并发程序更加容易和安全。

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