NSOperation的使用细节 [2]

这一节我们来写自定义nonconcurrent的operation,自定义nonconcurrent的operation很简单,重写main方法,之后处理好cancel事件即可。

在开始写nonconcurrent的operation之前,我们需要先了解几个关于NSOperationQueue的细节。

挂起操作

通常情况下,将操作添加到队列中是会立马执行的(如果没有设置队列的最大并发数目),将suspended设置成YES后会将没有执行的operation全部挂起。

NSOperationQueue无法重复添加NSOperation

并且,NSOperationQueue也无法移除已经添加的操作

NSOperationQueue的cancelAllOperations仅仅是将所有的NSOperation的isCancelled置位为YES而已(NSOperation自身的cancel操作也是将isCancelled设置成YES)

我们可以通过设置NSOperationQueue的maxConcurrentOperationCount来让操作按照添加顺序执行

注意哦,NSOperationQueue并不能将单个的NSOperation进行挂起操作,NSOperation自身也无法将自己暂停后再进行恢复操作,当NSOperation取消了之后,你再也无法对其进行恢复操作了,在NSOperationQueue上,你是无法实现的。

以下提供源码

//
// NonconcurrentOperation.h
// NSOperationExample
//
// Created by YouXianMing on 15/9/4.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
// #import <Foundation/Foundation.h> @interface NonconcurrentOperation : NSOperation @property (nonatomic, strong) NSString *urlString;
@property (nonatomic, strong, readonly) NSData *netData; @end
//
// NonconcurrentOperation.m
// NSOperationExample
//
// Created by YouXianMing on 15/9/4.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
// #import "NonconcurrentOperation.h" @interface NonconcurrentOperation () @property (nonatomic, strong) NSData *netData;
@property (nonatomic) BOOL isDone; @end @implementation NonconcurrentOperation - (void)main { if ([self isCancelled] == YES || [self isDone] == YES) { return;
} NSURL *url = [NSURL URLWithString:_urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url]; self.netData = [NSURLConnection sendSynchronousRequest:request
returningResponse:nil
error:nil];
if (self.netData) { self.isDone = YES;
} [self showThread];
} - (void)showThread { if ([NSThread currentThread].isMainThread == YES) { NSLog(@"Run in MainThread %@", self.name); } else { NSLog(@"Run in SubThread %@", self.name);
}
} @end
//
// ViewController.m
// NSOperationExample
//
// Created by YouXianMing on 15/9/4.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
// #import "ViewController.h"
#import "NonconcurrentOperation.h" @interface ViewController () { NonconcurrentOperation *operation1;
NonconcurrentOperation *operation2;
} @property (nonatomic, strong) NSOperationQueue *queue; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.queue = [[NSOperationQueue alloc] init];
self.queue.maxConcurrentOperationCount = ; // 操作1
operation1 = [[NonconcurrentOperation alloc] init];
operation1.urlString = @"http://pic.cnblogs.com/avatar/607542/20150807105148.png";
operation1.name = @"operation1"; // 操作2
operation2 = [[NonconcurrentOperation alloc] init];
operation2.urlString = @"http://pic.cnblogs.com/avatar/615197/20150505132152.png";
operation2.name = @"operation2"; [self.queue addOperation:operation1];
[self.queue addOperation:operation2]; [self performSelector:@selector(event) withObject:nil afterDelay:.f];
} - (void)event { NSLog(@"%@", self.queue.operations);
} @end

NSOperation的使用细节 [2]的更多相关文章

  1. NSOperation的使用细节 [3]

    NSOperation的使用细节 [3] 这一节我们来写自定义concurrent的operation,自定义concurrent的operation稍微有点复杂,需要按照某些既定的步骤编写才可以完成 ...

  2. NSOperation的使用细节 [1]

    NSOperation的使用细节 [1] NSOperation 使用起来并没有GCD直观,但它有着非常不错的面向对象接口,还可以取消线程操作,这一点是GCD所没有的,NSOperation本身是抽象 ...

  3. 认识和使用NSOperation

    原文链接:http://www.jianshu.com/p/2de9c776f226 NSOperation是OC中多线程技术的一种,是对GCD的OC包装.它包含队列(NSOperationQueue ...

  4. 多线程&NSObject&NSThread&NSOperation&GCD

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

  5. iOS之多线程开发NSThread、NSOperation、GCD

    原文出处: 容芳志的博客   欢迎分享原创到伯乐头条 简介iOS有三种多线程编程的技术,分别是:(一)NSThread(二)Cocoa NSOperation(三)GCD(全称:Grand Centr ...

  6. NSOperation, NSOperationQueue 原理探析

    通过GNUstep的Foundation来尝试探索下NSOperation,NSOperationQueue 示例程序 写一个简单的程序 - (void)viewDidLoad { [super vi ...

  7. iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD

    原文出处: 容芳志的博客 简介iOS有三种多线程编程的技术,分别是:(一)NSThread(二)Cocoa NSOperation(三)GCD(全称:Grand Central Dispatch) 这 ...

  8. 用NSOperation写下载队列

    用NSOperation写下载队列 说明 1. 支持缓存机制 2. 图片都是在主线程中加载 3. 文件名用了md5加密 *这东西被人写烂了,但大伙如果对NSOperation不熟悉的话,可以看看本人的 ...

  9. [New learn] NSOperation基本使用

    1.简介 NS(基于OC语言)是对GCD(基于C语言)的封装,让开发者能够更加友好的方便的去使用多线程技术. 2.NSOperation的基本使用 NSOperation是抽象类,所以如果要使用NSO ...

随机推荐

  1. 自然语言处理--N-gram

    考虑一个语音识别系统,假设用户说了这么一句话:“I have a gun”,因为发音的相似,该语音识别系统发现如下几句话都是可能的候选:1.I have a gun. 2.I have a gull. ...

  2. dockerfile基础命令

    一直想写一个, 但发现网上有很多了, 直接copy把 如何使用 Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等.当前目录下包含Dockerfile,使用命令build来 ...

  3. jquery.dataTables动态列--转

    转自 https://www.cnblogs.com/lyeo/p/4765514.html jquery.dataTables  版本1.10.7 直接上代码: 0.table <table ...

  4. npm run build之后生成的dist如何扔到服务器运行(npm run build之后如何本地运行)

    运行npm run build之后,会生成一个dist文件夹,里面的目录结构大概是这样的: 生成完的文件我们怎么来运行呢?直接在本地打开inde.html是无法运行的,打包的时候有提示: 构建文件应该 ...

  5. windows服务与其他进程使用MemoryMappedFile

    首先,名字必须以Global\开头. 其次,需要配置权限 var rule = new AccessRule<MemoryMappedFileRights>("everyone& ...

  6. Maven - dependency那些事儿

    身边有几位刚使用Maven的同学表示——在一个叫"pom.xml"的文件里声明一个依赖就不用去手动添加jar了,感觉这东西和自己手动管理依赖没太大区别. 当然,并不是这样,在此记录 ...

  7. C盘空间被占满的原因

    如何禁止IIS在C:\Windows\System32\LogFiles\HTTPERR中生成日志文件C:\Program Files\Microsoft SQL Server\MSSQL10_50. ...

  8. [日常] Go语言圣经-查找重复行

    从标准输入中读取数据 1.if语句条件两边也不加括号,但是主体部分需要加{} 2.map存储了键/值(key/value)的集合,对集合元素,提供常数时间的存.取操作,map[string]int = ...

  9. Spring Boot学习笔记(六)mybatis配置多数据源

    application.properties #数据库配置 #数据源类型 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource # ...

  10. 软件架构系列二:Clean架构

    外圈的层次可以依赖内层,反之不可以:内圈核心的实体代表业务,不可以依赖其所处的技术环境. 这是著名软件大师Bob大叔提出的一种架构,也是当前各种语言开发架构.干净架构提出了一种单向依赖关系,从而在逻辑 ...