IOS 有三种多线程编程的技术:
1.NSThread
2.Cocoa NSOperation
3.GCD(全称:Grand Central Dispatch
NSThread
优点:NSThread 比其他两个更轻量级
缺点:需要自己管理线程的生命周期,线程同步。 线程同步对数据的加锁会有一定的开销。
NSThread 方法总结
创建线程
/*
selector :线程执行的方法,这个 selector 只能有一个参数,而且不能有返回值。
target :selector 消息发送的对象
argument: 传输给 target 的唯一参数,也可以是 nil
*/
//线程对象初始化时创建一个线程 (指定线程函数)
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument
// 通过类方法创建一个线程
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
第一种方式会立即创建一个线程并执行 selector 方法,
第二种方式是先创建线程对象,要直到我们手动调用 start 启动线程 时才会真正去创建并启动线程 。在运行线程操作前可以设置线程的优先级等线程信息。
1、[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];
2、NSThread* myThread = [[NSThread alloc] initWithTarget:self
selector:@selector(doSomething:)
object:nil];
[myThread start];
补充:如果要更新 UI 必须回到主线程中, 可以用 performSelectorOnMainThread 回到主线程(更新 UI 的话必须到主线程),用或者调用或者调用 委托函数,在主线程中实现委托函数。
不显式创建线程的方法
其效果与 NSThread 的 detachNewThreadSelector:toTarget:withObject: 是一样的。
[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];
// 返回当前线程
+ (NSThread *)currentThread;
// 判断是否为多线程
+ (BOOL)isMultiThreaded;
// 判断当前线程是否为主线程
- (BOOL)isMainThread;
+ (BOOL)isMainThread;
+ (NSThread *)mainThread;
暂停当前线程几秒
[NSThread sleepForTimeInterval:4];
// 是否在执行
- (BOOL)isExecuting;
// 是否已经结束
- (BOOL)isFinished;
// 是否取消的
- (BOOL)isCancelled;
// 取消操作
- (void)cancel;
// 退出线程
+ (void)exit;