NSThreads,NSOperations和performSelector之间的区别

时间:2011-03-03 04:34:09

标签: iphone nsthread

我想问一些关于iPhone开发的简单而重要的问题。如果我们必须在后台执行任务并且后台任务完成时我们将更新UI,为此我们可以使用NSThreads,NSOperations或(performSelector)performSelectorInBackgroundThread。所有这些以及它们将如何影响我的应用程序性能之间的区别是什么。

还有一件事,这两个陈述之间的区别是什么: -

[self getData];

[self performSelector:@selector(getData)];

Please explain as i dont know the difference between all these things. 

3 个答案:

答案 0 :(得分:10)

之间实际上没有太大区别
[self getData];

[self performSelector:@selector(getData)];

唯一的区别是当您调用[self getData]时,编译器可以确定您要将getData消息发送到类[self class]的对象。如果它找不到任何方法原型,那么之前就会发出警告。

第一行和第二行将被翻译为

objc_msgsend(self, _cmd)
当你想在运行时做某事时,

performSelector:真的很酷(例如你在运行时确定你想要发送给对象的确切消息)。或者这里是“现实生活”中的一个例子:UIButton有方法

- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents

因此它将动作存储在其内部的某个位置,当它调用适当的控制事件时:

[target performSelector: action];

NSOperation只是一种用线程包装工作的好方法。而NSThread只是pthreads的包装。

所以你的应用程序性能并不真正取决于你使用线程的方式,但使用NSOperation而不是pthreads更容易做到这一点。

答案 1 :(得分:7)

NSThread是pthreads(POSIX线程)的包装器。 pthreads在Mach线程的顶部实现。您可以在使用NSThread时设置堆栈大小和优先级。 (顺便说一下,就我的经验而言,堆栈大小根本不会影响。)

NSOperation / NSOperationQueue是Grand Central Dispatch(libdispatch)又名GCD的包装器。 GCD在pthreads之上实现。对于许多任务,这些比NSThread更容易使用。它减少了任务排队,线程池管理等的样板代码。

performSelectorInBackground:调用NSThread并处理终止的NSThread。只使用一种方法调用它们是最容易的。

答案 2 :(得分:3)

总而言之,你不需要在大部分时间内自己使用NSThread,特别是如果你只使用Objective-C,时间问题并不重要。使用操作队列或调度队列实现行为。

NSOperation是某个任务的包装器或封装。任务可以定义为方法(NSInvocationOperation),或块(NSBlockOperation),或任何您想要的(通过子类化NSOperation)。因此,您需要做的第一件事就是以适当的方式包装您的工作(通常在方法或块中)。

然后您将操作放入操作队列。然后,操作队列将尽快在分离的线程中触发任务。

在iOS 4.0及更高版本中,您可以直接将块提供给队列,而无需构建操作对象。您还可以使用不同类型的作业队列,名为调度队列。

performSelectorinBackgroundThread类似于队列,因为它还为您创建一个线程并且(有效地)在该线程中运行一个方法。它有时可能很方便,但您仍然需要非常清楚将在分离线程上运行的任务单元。许多Cocoa方法都不是线程安全的,大多数UIKit操作都需要在主线程上运行。

这导致了最后的关注。您可以让分离的线程处理任务,但是根据结果更新UI应该在主线程上运行。例如,你可以这样做

[aUIObject performSelectorOnMainThread:@selector(setMessage :) withData:...