objective-c多线程编程的几种方法

本文介绍了Objective-C中实现多线程的三种方法:NSThread、NSOperation和GCD。详细阐述了每种方法的使用方式,包括线程创建、操作执行以及同步机制。在NSThread中提到了死锁问题,NSOperation则需要将操作对象加入到NSOperationQueue,而GCD通过dispatch_async函数灵活控制并发和顺序执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发中,我们经常会使用线程去处理一些问题,比如耗时的操作,并发执行的操作等。使用线程会让程序变得更有效率。简单记录下三种多线程编程,如有错误或不足,欢迎指正。

第一种方式:使用NSThread。

第二种方式:使用NSOperation。

第三种方式:使用GCD。即Grand Central Dispatch。

1,NSThread使用

NSThread初始化,可以使用对象方法- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument

第一个参数:指定的selector发送的目标对象,第二个参数:指定方法名,第三个参数:方法自带的参数。参数只能是一个并且方法不能有返回值。

通过初始化的NSThread的对象再调用-(void)start就可以启动这个线程。

还可以使用类方式去初始化并且立马启动线程。+(void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument 

三个参数与上面一样。还有其他一些方法可以参考苹果官方文档对NSThread类的详细描述。

这种方式的线程同步时需要考虑到死锁问题。

2,NSOperation的使用。

这种方式一般来说需要写一个NSOperation的子类,在子类中重写-(void)main方法。main方法就是你需要去处理的操作。最后需要把NSOperation对象,加入到NSOperationQueue里面去。还可以使用NSOperation的子类,NSInvocationOperation,初始化NSInvocationOperation :- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg 参数与NSThread一样,完成初始化之后把NSInvocationOperation添加到NSOperationQueue里面去。

3,GCD使用

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

        

        这里就是你写code需要去处理的事情

 

       if (得到你想要的结果) {

            dispatch_async(dispatch_get_main_queue(), ^{

             这里面就去刷新界面

            });

        }

        

    });

还有几个比较重要的函数, dispatch_group_async,dispatch_group_async, dispatch_barrier_async


 dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

    dispatch_group_t group =dispatch_group_create();

   dispatch_group_async(group, queue, ^{

       

       NSLog(@"线程一去做的事情");

    });

   dispatch_group_async(group, queue, ^{

       NSLog(@"线程二去做的事情");

      

    });

   dispatch_group_async(group, queue, ^{

        

       NSLog(@"线程三去做的事情");

    });

    dispatch_group_notify(group,dispatch_get_main_queue(), ^{

        NSLog(@"所有线程都完成了任务,可以通知主线程更新界面了");

    });


 

    dispatch_queue_t queue =dispatch_queue_create("test",DISPATCH_QUEUE_CONCURRENT);

   dispatch_async(queue, ^{

       

       NSLog(@"开启线程1");

    });

   dispatch_async(queue, ^{

       

       NSLog(@"开启线程2");

    });

    dispatch_barrier_async(queue, ^{

        NSLog(@"上面两个线程完成任务,开启我自己,我自己就叫线程3");

        

        

    });

   dispatch_async(queue, ^{

       

        NSLog(@"等线程3完成了再开启我,我叫线程4");

    });


由于翻译英语水平有限,翻译的也不是很准确,就不翻译了。一般来说,当你开启线程去处理某些问题的时候,在刷新界面则放到主线程里面去做。可以调用NSObject的Category方法,如下。

  id item;

    

    [selfperformSelectorOnMainThread:@selector(updateUI:)withObject:item waitUntilDone:YES];



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值