iOS 多线程技术2

NSOperation


  • NSInvocationOperation
  1. //创建一个队列
  2. NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  3. //创建子任务,定义子任务必须是 NSOperation 的子类
  4. NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(dosomething:) object:@"NSInvocationOperation"];
  5. //当把任务加入到队列后,自己主动开启线程
  6. [queue addOperation:op];
  • NSBlockOperation
  1. //创建一个队列
  2. NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  3. //创建 NSBlockOperation 对象
  4. NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
  5. [self doSomething];
  6. }];
  7. //加入队列
  8. [queue addOperat:operation];

Demo:

以下我用NSOperation 的两种方法来创建一个样例,实现与上篇一样的功能,

  1. #import "ViewController.h"
  2. ---
  3. @interface ViewController ()
  4. @property (weak, nonatomic) IBOutlet UIImageView *iamgeView;
  5. @property (weak, nonatomic) IBOutlet UILabel *lable;
  6. @property (nonatomic, strong) NSOperationQueue *queue;
  7. @end
  8. @implementation ViewController
  9. - (void)viewDidLoad {
  10. [super viewDidLoad];
  11. // 1.NSInvocationOperation
  12. NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(dosomething:) object:@"NSInvocationOperation"];
  13. op.name = @"xiaoming";
  14. NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  15. [queue addOperation:op];
  16. NSLog(@"%@",queue.operations);
  17. _queue = queue;
  18. }
  19. - (void)dosomething:(NSString*)str
  20. {
  21. //耗时操作
  22. [NSThread sleepForTimeInterval:3];
  23. //须要在主线程中更新 UI
  24. [self performSelectorOnMainThread:@selector(updateLable:) withObject:str waitUntilDone:YES];
  25. }
  26. - (void)updateLable:(NSString*)str
  27. {
  28. if ([[NSThread currentThread] isMainThread]) {
  29. NSLog(@"主线程>>>%s",__func__);
  30. }
  31. _lable.text = str;
  32. }
  33. - (IBAction)btnAction:(UIButton *)sender {
  34. NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
  35. //耗时操作
  36. [NSThread sleepForTimeInterval:3];
  37. //创建 url
  38. NSString *urlStr = @"http://img.hb.aicdn.com/5a8f57157b47284724d09ffd2da28369731f8144ac9c-1XdZKJ_fw658";
  39. NSURL *url = [NSURL URLWithString:urlStr];
  40. NSData *data = [NSData dataWithContentsOfURL:url];
  41. UIImage *image = [UIImage imageWithData:data];
  42. //更新 UI
  43. [self performSelectorOnMainThread:@selector(updateImageView:) withObject:image waitUntilDone:YES];
  44. }];
  45. [_queue addOperation:blockOp];
  46. }
  47. - (void)updateImageView:(UIImage*)img
  48. {
  49. if ([[NSThread currentThread] isMainThread]) {
  50. NSLog(@"主线程>>>>>>%s",__FUNCTION__);
  51. }
  52. _iamgeView.image = img;
  53. }
  54. @end

执行结果:

2015-08-02 15:03:33.909 05-NSOperationDemo[3284:874300] (

“{name = ‘xiaoming’}”

)

2015-08-02 15:03:36.911 05-NSOperationDemo[3284:874300] 主线程>>>-[ViewController updateLable:]

2015-08-02 15:03:47.730 05-NSOperationDemo[3284:874300] 主线程>>>>>>-[ViewController updateImageView:]


iOS 多线程技术2的更多相关文章

  1. iOS多线程技术方案

    iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...

  2. iOS多线程技术

    iOS多线程技术主要分配NSThread.NSOperation和GCD.下边来简单的介绍一下吧. 随性一点,就不按照顺序来了.所以先介绍一下NSOperation. ---------------- ...

  3. 浅谈iOS多线程

    浅谈iOS多线程 首先,先看看进程和线程的概念. 图1.1 这一块不难理解,重点点下他们的几个重要区别: 1,地址空间和资源:进程可以申请和拥有系统资源,线程不行.资源进程间相互独立,同一进程的各线程 ...

  4. iOS开发之多线程技术

    本篇争取一篇讲清讲透,依然将通过四大方面清晰的对iOS开发中多线程的用法进行详尽的讲解: 一.什么是多线程 1)多线程执行原理 2)线程与进程 3)多线程的优缺点 二.我们为什么要用多线程编程技术 三 ...

  5. iOS的三种多线程技术NSThread/NSOperation/GCD

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...

  6. 多线程技术在iOS开发中的使用

    进程和线程 要使用多线程,首先需要理解进程和线程这2个概念.这里我简单的说一下. 所谓进程对应的是一个应用程序,负责开辟内存空间供应用程序使用,但是进程不能执行任务(指令).一个进程至少包含一条线程, ...

  7. OS X 和iOS 中的多线程技术(上)

    OS X 和iOS 中的多线程技术(上) 本文梳理了OS X 和iOS 系统中提供的多线程技术.并且对这些技术的使用给出了一些实用的建议. 多线程的目的:通过并发执行提高 CPU 的使用效率,进而提供 ...

  8. OS X 和iOS 中的多线程技术(下)

    OS X 和iOS 中的多线程技术(下) 上篇文章中介绍了 pthread 和 NSThread 两种多线程的方式,本文将继续介绍 GCD 和 NSOperation 这两种方式.. 1.GCD 1. ...

  9. iOS的多线程技术

    iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØN ...

随机推荐

  1. 转 关于oracle 分区表 表空间以及索引的总结

    关于oracle的表空间,分区表,以及索引的总结关键字: oracle, 表空间, 分区表, 索引 上周第一次做数据库测试碰到了很多问题特此总结: 表空间: Oracle的UNDOTBS01.DBF文 ...

  2. 正在创建模型,此时不可使用上下文“的解决办法。 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。请注意不

    //默认为: Database.SetInitializer<testContext>(null);//这里报错, 检查原因:catch(Exception ex) 错误提示: 基础连接未 ...

  3. MySQL 表数据的导入导出

    数据导出 1.  使用 SELECT ...INTO OUTFILE ...命令来导出数据,具体语法如下. mysql> SELECT * FROM tablename INTO OUTFILE ...

  4. linux各种版本查看方法

    1.linux内核版本 cat /proc/version Linux version 4.13.0-39-generic (buildd@lgw01-amd64-038) (gcc version ...

  5. manacher-模板-hd-3068

    /* 题意:给一个字符串,求该串的最长回文串的长度: 算法:Manacher O(n)复杂度,求以每一个字符为中心的最长汇文串的长度: 这个算法把奇数和偶数的情况和在一起来考虑了: */ #inclu ...

  6. HDU——1013Digital Roots(九余数定理)

    Digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  7. [JLOI2011]飞行路线 (分层图,最短路)

    题目链接 Solution 建立 \(k+1\) 层图跑 \(Dijkstra\) 就好了. Code #include<bits/stdc++.h> #define ll long lo ...

  8. hdu 4305 生成树计数问题

    Lightning Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. hdu 4301 dp

    Divide Chocolate Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  10. 【HDOJ6229】Wandering Robots(马尔科夫链,set)

    题意:给定一个n*n的地图,上面有k个障碍点不能走,有一个机器人从(0,0)出发,每次等概率的不动或者往上下左右没有障碍的地方走动,问走无限步后停在图的右下部的概率 n<=1e4,k<=1 ...