iOS 多线程技术2

iOS 多线程技术2

NSOperation


  • NSInvocationOperation
        //创建一个队列
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];

        //创建子任务,定义子任务必须是 NSOperation 的子类
        NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(dosomething:) object:@"NSInvocationOperation"];

        //当把任务添加到队列后,自动开启线程
        [queue addOperation:op];
  • NSBlockOperation
            //创建一个队列
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];

        //创建 NSBlockOperation 对象
        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        [self doSomething];
        }];

        //加入队列
        [queue addOperat:operation];

Demo:

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

#import "ViewController.h"

---

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *iamgeView;
@property (weak, nonatomic) IBOutlet UILabel *lable;

@property (nonatomic, strong) NSOperationQueue *queue;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 1.NSInvocationOperation
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(dosomething:) object:@"NSInvocationOperation"];
    op.name = @"xiaoming";

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:op];

    NSLog(@"%@",queue.operations);
    _queue = queue;
}

- (void)dosomething:(NSString*)str
{
  //耗时操作
    [NSThread sleepForTimeInterval:3];

    //需要在主线程中更新 UI
    [self performSelectorOnMainThread:@selector(updateLable:) withObject:str waitUntilDone:YES];
}
- (void)updateLable:(NSString*)str
{
    if ([[NSThread currentThread] isMainThread]) {
        NSLog(@"主线程>>>%s",__func__);
    }
    _lable.text = str;
}
- (IBAction)btnAction:(UIButton *)sender {

    NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
        //耗时操作
        [NSThread sleepForTimeInterval:3];

        //创建 url
        NSString *urlStr = @"http://img.hb.aicdn.com/5a8f57157b47284724d09ffd2da28369731f8144ac9c-1XdZKJ_fw658";
        NSURL *url = [NSURL URLWithString:urlStr];
        NSData *data = [NSData dataWithContentsOfURL:url];

        UIImage *image = [UIImage imageWithData:data];

        //更新 UI
        [self performSelectorOnMainThread:@selector(updateImageView:) withObject:image waitUntilDone:YES];
    }];
    [_queue addOperation:blockOp];
}
- (void)updateImageView:(UIImage*)img
{
    if ([[NSThread currentThread] isMainThread]) {
        NSLog(@"主线程>>>>>>%s",__FUNCTION__);
    }

    _iamgeView.image = img;
}

@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:]


版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-24 21:07:06

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

OA01-一个Demo展示iOS多线程技术的基本应用场景

最近在看iOS关于GCD.NSOperation多线程编程技术编程指南的时候写了个 小Demo,以7个小场景基本涵盖多线程技术的主流用法:其实多线程技术早在大学 读书的时候,基本思路就已经清晰了,不同操作系统的多线程实现也大同小异,iOS 平台下原理也是一样,关键就在与,能否熟练的.很顺畅的根据应用场景来选用相应 的多线程技术.阅读苹果官方文档和一些别人写的博客的时候也依然有种隔靴捞痒的 感觉:书读百边,不如实践一遍啊,SO,尽管网上相关的博客一大堆(首推这篇: http://www.cocoa

iOS多线程技术—线程的状态

iOS多线程技术—线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; 说明:创建线程有多种方式,这里不做过多的介绍. 线程的开启: [self.thread start]; 线程的运行和阻塞: (1)设置线程阻塞1,阻塞2秒 [NSThread sleepForTimeInterval:2.0]; (2)第二种设置线程阻塞2,以当前时间

iOS多线程技术—单例模式(ARC)与(MRC)

iOS多线程技术—单例模式(ARC) 一.简单说明: 设计模式:多年软件开发,总结出来的一套经验.方法和工具 java中有23种设计模式,在ios中最常用的是单例模式和代理模式. 二.单例模式说明 (1)单例模式的作用 :可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源. (2)单例模式的使用场合:在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次),应该让这个类创建出来的对象永远只有一个. (3)单例模式在ARC\MRC环

iOS多线程技术—自定义NSOperation

iOS多线程技术—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. // // YYViewController.h // 01-自定义Operation // // Created by apple on 14-6-26. // Copyright (c) 2014年 itcase. All rights reserved.

iOS多线程技术—GCD介绍

iOS多线程技术—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 3.提示 (1)GCD存在于libdispatch.dylib这个库中,

iOS多线程技术—GCD的用法

iOS多线程技术—GCD的用法 一.主队列介绍 主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行. 提示:如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的线程. 获取主队列的方式: 1 // 2 // YYViewController.m 3 // 12-GCD的基本使用(主队列) 4 // 5 // Created by 孔医己 on 14-6-25. 6 // Copyright (c) 2014

iOS 多线程技术1

iOS 多线程技术1 iOS 有三种多线程编程技术: NSThread NSOperation GCD 它们的抽象程度由低到高,越高的使用起来越简单. NSThread 显示调用 NSthread 类 类方法 + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument; 实例方法 - (instancetype)initWithTarget:(id)target selecto

iOS多线程技术—NSOperation用法

iOS多线程技术—NSOperation用法 一.NSOperation简介 1.简单说明 NSOperation的作?:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: (1)先将需要执行的操作封装到一个NSOperation对象中 (2)然后将NSOperation对象添加到NSOperationQueue中 (3)系统会?动将NSOperationQueue中的NSOperat

iOS多线程技术—多线程简单介绍

iOS多线程技术—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中执行 3.线程的