IOS多线程编程总结
IOS多线程主要有三种方式:NSThread,NSOperation,GCD
一,NSThread。
启动:- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument
[thread start];
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
停止:- cancle
+ exit
更新主线程或其他线程:[self performSelectorOnMainThread:@selector() withObject:obj waitUntilDone:YES];
优点:NSThread 比其他两个轻量级。
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销。
二,NSOperation。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//线程执行内容
dispatch_async(dispatch_get_main_queue(), ^{
//刷新主线程
});
});
如果想要在block里面修改block外的变量,需要加__block修饰变量。
更详细的用法可参考:http://blog.devtang.com/blog/2012/02/22/use-gcd/
四,NSRunLoop
NSRunLoop是一个比较大的话题。简单来说,它是用来监控线程的输入源。这里讲的输入源可以是用户输入事件,网络连接(socket收到数据),异步回调(比如在线程中使用NSURLConnection就要用到NSRunLoop,否则它的delegate就不会被调用,因为线程在发送URL请求的时候就结束了),还有就是定时或延迟事件(NSTimer)。每一个线程都会有一个runloop,主线程是自动启动的,而子线程就要手动启动。
举个例子在子线程使用NSURLConnection时,在queue的start方法中:
while(_connection != nil) {
[[NSRunLoopcurrentRunLoop] runMode:NSDefaultRunLoopModebeforeDate:[NSDatedistantFuture]];
}
这样线程就会等到接收到异步数据时,把_connection设为nil时才结束。整个while循环时是不会耗费cpu资源的,因为runloop会休眠,等到被唤醒才会工作。
比较NSOperation和gcd:
共同:都是隐式的使用NSThread
前者:oc-based。更简单,而且方便管理多个线程,还可以管理他们的优先级。实现的时候处理比较多加锁机制,是重量级。而且它是gcd之上的抽象,更高级。
后者:c-based。轻量级

浙公网安备 33010602011771号