iOS中的多线程 NSOperation

  在ios中,使用多线程有三种方式,分别是:NSThread、NSOperation和NSOperationQueue、GCD,在本节,主要讲解一下NSOperation的使用。

  NSOperation和NSOperationQueue这种方式实际上是将NSOperation的对象放到一个NSOperationQueue队列中,然后依次启动操作,类似于线程池的使用。

  在使用的过程中,NSOperation的操作使用的是它的子类,分别是NSInvocationOperation和NSBlockOperation,两者没有本质的区别,只不过后者以Block的方式来实现,使用相对简单。NSOperationQueue主要负责管理和执行所有的NSOperation对象,并控制线程之间的执行顺序与依赖关系。

  下面,通过NSOperation开始多线程从网络获取图片并刷新。

NSInvocationOperation

代码

//  ViewController.m
//  AAAAAA
//
//  Created by jerei on 15-11-8.
//  Copyright (c) 2015年 jerehedu. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

#pragma mark - 点击按钮开启线程下载图片
- (IBAction)click_InvocationOpreation_load:(UIButton *)sender {

    NSURL *url = [NSURL URLWithString:@"http://www.jerehedu.com/images/temp/logo.gif"];

    //创建一个operation
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImageWithUrl:) object:url];

    //添加到操作队列中
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:operation];
}

#pragma mark - 根据url获取图片
-(void)loadImageWithUrl:(NSURL *)url{

    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];

    //回到主线程更新界面
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateImageView:) object:image];

    [[NSOperationQueue mainQueue] addOperation:operation];
}

#pragma mark - 更新界面
-(void)updateImageView:(UIImage *)img{
    _imageView.image = img;
}

@end

NSBlockOperation

代码

//  ViewController.m
//  AAAAAA
//
//  Created by jerei on 15-11-8.
//  Copyright (c) 2015年 jerehedu. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

#pragma mark - 点击按钮开启线程下载图片
- (IBAction)click_BlockOpreation_load:(UIButton *)sender {

    //创建操作队列
    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
    //设置最大并发线程数
    operationQueue.maxConcurrentOperationCount = 5;

    //<方法一> 创建operation
//    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
//        //根据url请求数据
//        NSURL *url = [NSURL URLWithString:@"http://www.jerehedu.com/images/temp/logo.gif"];
//        [self loadImageWithUrl:url];
//    }];
//
//    //添加到队列中
//    [operationQueue addOperation:operation];

    //<方法二> 创建operation
    [operationQueue addOperationWithBlock:^{
        //根据url请求数据
        NSURL *url = [NSURL URLWithString:@"http://www.jerehedu.com/images/temp/logo.gif"];
        [self loadImageWithUrl:url];
    }];
}

#pragma mark - 根据url获取图片
-(void)loadImageWithUrl:(NSURL *)url{

    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];

    //回到主线程更新界面
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        [self updateImageView:image];
    }];
}

#pragma mark - 更新界面
-(void)updateImageView:(UIImage *)img{
    _imageView.image = img;
}

@end

作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
版权声明:本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

技术咨询:

时间: 2024-12-24 06:05:57

iOS中的多线程 NSOperation的相关文章

IOS中的多线程【二】— NSOperation和NSOperationQueue

NSOperationQueue是一套基于Objective-c语言的API. GCD与NSOperationQueue的优缺点: NSOperationQueue:比较安全 GCD:没有NSOperationQueue安全,但使用起来简单,快速,还提供了一些操控底层的方法.实际开发中还是以GCD为主. NSOperationQueue实现多线程流程 1.定义一个任务队列. 2.定义一个任务. 3.把任务添加到队列中.一旦任务被添加到队列中,任务会马上被调度执行. 任务队列(NSOperatio

iOS开发笔记--iOS中的多线程

摘要 本文主要介绍iOS开发中的三种多线程技术:NSThread, NSOperation/NSOperationQueue, GCD.以及在多线程编程中的注意点和小技巧. 多线程 NSThread NSOperation/NSOperationQueue GCD 目录[-] iOS中的多线程 iOS的三种多线程技术特点: GCD基本思想 队列: 操作: 不同队列中嵌套同步操作dispatch_sync的结果: 同步操作dispatch_sync的应用场景: GCD优点: GCD队列: NSOp

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

OS X 和iOS 中的多线程技术(下) 上篇文章中介绍了 pthread 和 NSThread 两种多线程的方式,本文将继续介绍 GCD 和 NSOperation 这两种方式.. 1.GCD 1.1 什么是GCD GCD 全称 Grand Central Dispatch,可译为"牛逼的中枢调度器" GCD 基于纯 C 语言,内部封装了强大的函数库 1.2 使用 GCD 有什么优势 GCD 是苹果公司为多核的并行运算提出的解决方案 GCD 会自动利用更多的CPU内核 (如 二核 ,

ios中的多线程的用法总结

ios中的多线程的用法总结 1.进程的基本概念 (1)每一个进程都是一个应用程序,都有独立的内存空间,一般来说一个应用程序存在一个进程,但也有多个进程的情况 (2)同一个进程的线程共享内存中的内存和资源 2.多线程的基本概念 (1)每一个程序都有一个主线程,程序启动时创建(调用main来启动). (2)多线程技术表示,一个应用程序有多个线程,使用多线程能提供CPU的利用率,防止主线程被堵塞. (3)任何有可能堵塞主线程的任务不要在主线程执行(如:访问网络). (4)主线程的生命周期和应用程序绑定

iOS中的多线程

iOS中的多线程 首先来了解什么是多线程,进程和线程的区别. 进程: 正在进行中的程序被称为进程,负责程序运行的内存分配; 每一个进程都有自己独立的虚拟内存空间. 线程:(主线程最大占1M的栈区空间,每条子线程最大占512K的栈区空间) 线程是进程中一个独立的执行路径(控制单元); 一个进程中至少包含一条线程,即主线程; 可以将耗时的执行路径(如网络请求)放在其他线程中执行; 线程不能被杀掉,但是可以暂停/休眠一条线程. 创建线程的目的: 开启一条新的执行路径,运行指定的代码,与主线程中的代码实

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

OS X 和iOS 中的多线程技术(上) 本文梳理了OS X 和iOS 系统中提供的多线程技术.并且对这些技术的使用给出了一些实用的建议. 多线程的目的:通过并发执行提高 CPU 的使用效率,进而提供程序运行效率. 1.线程和进程 进程 什么是进程 进程是指在计算机系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行中其专用且受保护的内存空间内 比如同时打开 Xcode .Safari ,系统就会分别启动两个进程 通过活动监视器可以查看Mac系统中所开启的进程 线程 什么是线程 一

iOS中的多线程及GCD

多线程中的一些概念 //任务:代码段  方法  线程就是执行这些任务 //NSThread类 创建线程 执行线程 [NSThread isMainThread]//判断是否是主线程 #import "AppDelegate.h" @implementation AppDelegate -(void)dealloc { [_window release]; [super dealloc]; } - (BOOL)application:(UIApplication *)applicatio

iOS中关于多线程的实现方案的介绍(一)

什么是进程 >  进程是指在系统中正在运行的一个应用程序 >  每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 什么是线程 >  1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) >  线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 什么是多线程 >  1个进程中可以开启多条线程,每条线程可以并发(同时)执行不同的任务 >  进程 à 车间,线程 à 车间工人 >  多线程技术可以提高程序的执行效率 多线程的原

IOS中的多线程实现:NSThread、GCD和NSOperation

1.NSThread 先创建,后启动 NSThread *thread = [NSThread allc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; 直接启动 2.GCD 3.NSOperation