三种开辟工作线程的方法

NSThread

UI主线程之外,利用NSThread开辟一个工作线程,让子线程执行downloadString方法(主要执行耗时操作)

1.[NSThread detachNewThreadSelector:@selector(downloadString) toTarget:self withObject:nil]; //  创建线程并调用对应的方法

2.NSThread * thread = [[NSThread alloc]initWithTarget:self selector:@selector(downloadString) object:nil];

[thread start]; // 必须调用start方法才会调用

子线程的生命周期,与子线程函数执行的生命周期一致,子线程需要单独的自动释放池,当子线程执行结束,与主线程交互,将数据传给UI主线程,子线程与主线程的通讯方式:让主线程执行方法,将result传过去,waitUntilDone是否等待主线程操作完成再继续向下执行            [self performSelectorOnMainThread:@selector(downloadFinished:)withObject:result waitUntilDone:NO];  // 此方法在主线程执行


NSOperation

nsoperation和nsthread使用类似

开辟线程

方法一,需要调用start方法

NSInvocationOperation * operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(downloadSomthing) object:nil]; // 一般使用nsoperation的子类

[operation start]

方法二,

多个线程同时执行自己的方法(异步并发操作)

[_opoerationQueue addOperation:operation];   // operationQueue 任务队列

添加多个任务到任务队列

[_opoerationQueue addOperations:(NSArray *) waitUntilFinished:(BOOL)];


执行任务对应的方法


返回结果

[self performSelectorOnMainThread:@selector(operationFinished:) withObject:result waitUntilDone:NO]; // 此方法在主线程执行


GCD   (block版本的operation)

GCD中有一个主队列,来管理主线程,有三个优先级的全局队列,用来管理和维护子线程

利用全局队列开辟一个线程   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^{

        // 子线程对应的操作

        

        

        // 操作完成后通过主队列回到主线程

        dispatch_async(dispatch_get_main_queue(),^{

             // 主线程对应的函数

        });


  });








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值