NSOperation相关

作者: tiGress | 来源:发表于2017-07-17 13:15 被阅读8次

    1.Nsopreation的作用:

    配合nsopreation和nsopreationqueue也能实现多线程编程

    2.实现多线程的步骤:

    1.将需要执行的操作,封装到nsopreation对象中

    2.然后将nsopreation对象添加到nsopreationqueue中

    3.系统会自动取出nsopreation和nsopreationqueue

    4.将取出的nsopreation封装的操作放到一条新线程中执行。

    3.Nsopreation的子类:

    Nsopreation是个抽象类,并不具备封装操作的能力,必须使用他的子类

    4.使用nsopreation子类的方法有三种:

    NSInvocationOperation

    NSBlockOperation

    自定义nsoperation

    1.NSInvocationOperation

    NSBlockOperation:

    2.NSBlockOperation

    5.NSOperation:

    主队列:[NSOperation MainQueue]和gcd中的主队列是一样的,是串行队列。

    非主队列:[NSOperation alloc]init];非主队列同时具备并发和串行的功能。

    默认情况下,非主队列是并发队列。

    //将操作放到队列中,实现多线程

    3.NSInvocationOperation实现多线程 4.NSBlockOperation实现多线程

    6.自定义NSOperation

    创建一个类,继承nsthread,然后在这个类的.m文件中重写main方法,告知要执行的任务代码。

    自定义的好处:1.有利于代码的隐藏2.有利于代码的复用

    5.

    6.NSOperation的其他方法

    1.设置最大并发数maxConcurrentOperationCount

    2.根据这个属性,可以控制是并行队列还是串行队列。

    3.如果一个队列事并发队列,开启了子线程。同一时间有多个操作在执行。最大并发数:指的是同一时间最多有多少个任务在执行,控制同一时间任务执行的任务数量。默认不受控制/设置为0,不能执行任务。如果设置为1,则是串行任务

    4.串行执行任务不等于只开一条线程

    5.如果maxConcurrentOperationCount >1,并发队列

    maxConcurrentOperationCount=1串行队列

    maxConcurrentOperationCount =0任务不会执行

    maxConcurrentOperationCount =-1,特殊意义:表示最大值。表示队列的最大并发数不受限制。

    对于自定义nsopreation,系统的canlcle等方法都不管用。建议在重写main方法的时候添加:

    7.nsopreation 实现依赖和监听。

    1.操作依赖:

    依赖

    2.操作监听

    监听

    8.nsopreation实现线程见的通信

    线程通信

    9.案例,用nsopreation的方法实现两张图片下载完成后合成一张图片。(考虑用依赖关系。合成图片的线程操作要依赖于两个下载图片的操作)附上代码

    //案例2。下载两张图片。下载完以后合并图片。用nsopreation实现..可以用依赖关系实现

    -(void)downloadsimages{

    //1.创建队列

    NSOperationQueue*queue = [[NSOperationQueuealloc]init];

    __blockUIImage*image1;

    __blockUIImage*image2;

    //2封装操作,下载图片1

    NSBlockOperation*download1 = [NSBlockOperationblockOperationWithBlock:^{

    NSURL*url = [NSURLURLWithString:@"http://s15.sinaimg.cn/bmiddle/4c0b78455061c1b7f1d0e"];

    NSData*imageData = [NSDatadataWithContentsOfURL:url];

    image1 = [UIImageimageWithData:imageData];

    NSLog(@"download---%@",[NSThreadcurrentThread]);

    }];

    //3封装操作,下载图片2

    NSBlockOperation*download2 = [NSBlockOperationblockOperationWithBlock:^{

    NSURL*url = [NSURLURLWithString:@"http://www.027art.com/feizhuliu/UploadFiles_6650/201109/2011091718442835.jpg"];

    NSData*imageData = [NSDatadataWithContentsOfURL:url];

    image2 = [UIImageimageWithData:imageData];

    NSLog(@"download---%@",[NSThreadcurrentThread]);

    }];//4.封装合并图片的操作

    NSBlockOperation*combie = [NSBlockOperationblockOperationWithBlock:^{

    //4.1开上下文

    UIGraphicsBeginImageContext(CGSizeMake(200,200));

    //4.2画图1

    [image1drawInRect:CGRectMake(0,0,100,200)];

    //4.3画图2

    [image2drawInRect:CGRectMake(100,0,100,200)];

    //4.4根据上下文得到图片

    UIImage*image =UIGraphicsGetImageFromCurrentImageContext();

    //4.5关闭上下文

    UIGraphicsEndImageContext();

    //7.更新UI

    [[NSOperationQueuemainQueue]addOperationWithBlock:^{

    self.imageVieww.image= image;

    NSLog(@"UI----%@",[NSThreadcurrentThread]);

    }];

    }];

    //5.设置依赖合成图片的操作需要依赖download 1,2

    [combieaddDependency:download1];

    [combieaddDependency:download2];

    //6.添加操作到队列中

    [queueaddOperation:download1];

    [queueaddOperation:download2];

    [queueaddOperation:combie];

    }

    相关文章

      网友评论

        本文标题:NSOperation相关

        本文链接:https://www.haomeiwen.com/subject/wwvfkxtx.html