2009-05-29 37 views
6

目标C中是否有线程?如果是这样,他们是如何申报和使用的?目标C中的线程

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

感谢和问候。

回答

9

如果您正在开发使用Cocoa(即用于Mac或iPhone),则可以访问NSThread类,该类可用于多线程。谷歌搜索NSThread会找到你的API。

你可以声明它就像使用:

NSThread *mythread = [[NSThread alloc] initWithTarget:target selector:selector object:argument]; 

如果目标和选择是要启动一个线程对象,并选择和参数是要发送到选择的参数。

然后用[mythread start]启动它。

18

一个简单的方法就是在新线程中分离一个方法就是使用。

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument on NSThread。如果你没有运行垃圾收集,你需要建立你自己的autorelease池。

另一个简单的方法,如果你只是不想阻止主线程是使用。

NSObject

- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg取决于你是什么类型的并发性,你也应该看看NSOperation,可以给你免费的锁定后,这样你就可以除其他事项外多个线程之间共享。

3

你也可以看看NSOperation

要看到这样的一个例子,看看德鲁·麦科马克对MacResearch岗位。

+0

NSOperation仅支持iOS 4.0或更高版本。 – 2011-04-15 09:25:29

2

在远离诸如detachNewThreadSelector之类的东西之前:一定要查看Apple的官方文档。对于选项的高级概述(包括操作队列,调度队列等),有Concurrency Programming Guide。而且,对于较低级别(并且不太推荐)的线程,有Threading Programming Guide

你绝对不想在没有看到苹果首先就这个主题说什么的情况下开始转动线程。他们用GCD等工具做了很多工作,以便更容易和更安全地编写并发程序。

5

是有在Objective 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

Follow this link

4>在后台线程,一旦它建成使用GCD

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

威尔callWebService。主线程中将会有updateUIMore about GCD

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