Objective C中有线程吗?如果是这样,他们如何宣布和使用?
如果有人知道Objective C中的多线程,请与我分享。
谢谢和问候。
答案 0 :(得分:18)
在新线程中分离方法的一种简单方法是使用。
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
上的 NSThread
。如果您没有运行垃圾收集,则需要设置自己的自动释放池。
如果您不想阻止主线程,另一种简单的方法就是使用。
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
上的 NSObject
根据您所使用的并发类型,您还应该查看可以为您提供免费锁定的NSOperation
,以便您可以在多个线程之间共享它。
答案 1 :(得分:9)
如果您正在使用Cocoa(即用于mac或iphone)进行开发,则可以访问NSThread
类,该类可用于多线程。通过Google搜索NSThread
会找到API。
您可以将其声明为使用:
NSThread *mythread = [[NSThread alloc] initWithTarget:target selector:selector object:argument];
target和selector是你想要启动一个线程的对象和选择器,而argument是一个发送给选择器的参数。
然后使用[mythread start]启动它。
答案 2 :(得分:6)
是的,目标C中存在线程概念。在目标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
一旦完成。它将在主线程中updateUI
。More about GCD
这几乎是iOS中使用的多线程的所有方式。希望这有帮助。
答案 3 :(得分:3)
您还可以查看NSOperation
要查看此示例,请查看Drew McCormack在MacResearch上的帖子。
答案 4 :(得分:2)
在使用detachNewThreadSelector之类的东西之前:请务必查看Apple的官方文档。对于选项的高级概述(包括操作队列,调度队列等),有Concurrency Programming Guide。而且,为了查看较低级别(且不太推荐)的线程,可以使用Threading Programming Guide。
你绝对不想在没有阅读苹果公司首先谈论的主题的情况下开始启动线程。他们使用像GCD这样的东西做了很多工作,使编写并发程序更容易,更安全。