iOS多线程GCD NSThread的使用和理解

来源:互联网 发布:联通网络id 编辑:程序博客网 时间:2024/06/05 07:25

多线程的知识点:

使用情况:耗时,不知道什么会结束的情况,,需要与其他操作同步执行的操作,

遇到耗时的操作时,新建线程去执行,可以保证主线程流畅

主线程是其他线程的最终父线程 所有界面操作必须在主线程

后台线程无法操作ui和任何的用户操作响应

创建一个新的线程都会消耗一定的内存和CPU时间,控制好线程顺序

多个线程同时执行会出现抢夺资源的问题,要注意线程安全 

主线程堆栈大小1M 第二个是512kb

[NSThread currentThread] 中的num=1为主线程

线程异步,无法控制先后顺序,,



以下写出多线程常用的两种方法,本人常用的是GCD,对于NSThread只是了解,对于Cocoa operation不是太了解(最后一种不做解释,有需要的自己查询)

GCD

GCD常用 dispatch_async  防止页面处理操作时出现卡顿,最常见的就是页面数据刷新,保证页面流畅的情况下更新数据, 这个方法比其他线程操作流程更简单,基于c语言的api ,结合block简化了线程的操作 代码框架如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        //数据获取

        dispatch_async(dispatch_get_main_queue(), ^{

           //页面更新

    });

});  


如果queue的类型设置为串行的类型,线程会产生死锁

参数dispatch_queue_t queue队列生成 

以上的线程的操作框架可以解决常见的基本的问题,可以直接使用,

如果对GCD有更深的需求和理解推荐几篇文章,各路大神已经总结的很好了。如果英文足够好可以看一下官方文档,其他几篇是对用法的总结

https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html#//apple_ref/doc/uid/TP40008079     GCD官方文档

https://en.wikipedia.org/wiki/Grand_Central_Dispatch  GCD参考

http://www.cnblogs.com/madpanda/p/4694866.html GCD参考

http://blog.csdn.net/totogo2010/article/details/8016129 GCD参考





NSThread

优点:轻量级

缺点:需要自己管理线程生命周期,线程同步对数据的加锁会对系统造成压力


NSThread有两种直接创建方式

- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument


参数意义:

selector:线程执行方法,

targetselector消息发送的对象

argument:一般为nil


第一种方式会直接创建线程并且开始运行线程,第二种方式是先创建线程对象,然后再运行线程操作,在运行线程操作前可以设置线程的优先级等线程信息




0 0