线程间的通信

1、什么叫做线程间通信

  在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信

2、线程间通信的体现

  1个线程传递数据给另1个线程

  在1个线程中执行完特定任务后,转到另1个线程继续执行任务

3、线程间通信示例

  UIImageView下载图片这个例子, 主线程中开启一个子线程去下载图片, 当图片下载完成之后再回到主线程中更新显示图片, 这样的一个过程就是线程间通信的一个过程.

4、NSThread线程间通信常用方法

// 第一种

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

// 第二种

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

5、使用NSThread多线程间通信

- (void)viewDidLoad

 {

         [super viewDidLoad];

       // 使用多线程来下载图片

         [NSThread detachNewThreadSelector:@selector(downloadImage) toTarget:self withObject:nil];

  }

 - (void)downloadImage

 {

         NSLog(@"开始下载图片 %@", [NSThread currentThread]);

   

       // 下载的方法

        // 1. url网络资源

         NSURL *url = [NSURL URLWithString:@"http://pic12.nipic.com/20110124/4814485_135921152102_2.jpg"];

   

       // 2. OC原生的方法,网络上的所有数据都是以“二进制或者字符串”的方式传递的

       // 在以后的开发中,几乎不用,因为性能太差

       NSData *data = [NSData dataWithContentsOfURL:url];

  

    // 3. 根据下载的数据建立图像

      UIImage *image = [UIImage imageWithData:data];

 

  NSLog(@"完成下载图片 %@", [NSThread currentThread]);


     // 更新UI,需要在主线程上进行

    // waitUntilDone:是否等待setImage:方法结束

     [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];

  }

以上代码是用NSThread多线程方式实现子线程下载图片,在主线程更新UI的操作


  上边这段代码是有问题的,应该在多线程上加一个自动释放池


6、使用GCD完成多线程间通信

- (void)viewDidLoad

{

      [super viewDidLoad];

    

     // 下载图片

      [self downloadImage];

    }


 - (void)downloadIma{

       // 1. 全局并行队列

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    

         // 2. 异步任务

     dispatch_async(queue, ^{

                NSLog(@"开始下载图片 %@", [NSThread currentThread]);

      

               // 下载的方法

                // 1. url网络资源

               NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1208/30/c0/13398570_1346308990114_800x600.jpg"];

     

                // 2. OC原生的方法,网络上的所有数据都是以“二进制或者字符串”的方式传递的

              // 在以后的开发中,几乎不用,因为性能太差

              NSData *data = [NSData dataWithContentsOfURL:url];

       

               // 3. 根据下载的数据建立图像

               UIImage *image = [UIImage imageWithData:data];

      

           NSLog(@"完成下载图片 %@", [NSThread currentThread]);

      

          // 4. 通知主队列更新UI

              // 给主队列,添加一个异步任务,更新UI

            dispatch_async(dispatch_get_main_queue(), ^{

                    self.image = image;

             });

      });

}

与NSThread方式相比,不用考虑自动释放池的问题,而且异步任务的操作都是放在块代码中,比较集中,可读性好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值