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. LR、HMM、CRF和MaxEnt区别

    LR:Logistic 是 Softmax 的特殊形式,多以如果 Softmax 与 MaxEnt 是等价的,则 Logistic 与 MaxEnt 是等价的. HMM模型: 将标注看作马尔可夫链,一 ...

  2. mysql保留两位小数

    --这个是保留整数位 SELECT CONVERT(4545.1366,DECIMAL); --这个是保留两位小数 ,)); --这个是截取两位,并不会四舍五入保留两位小数 );

  3. Mahout实战---运行第一个推荐引擎

    创建输入 创建intro.csv文件,内容如下 1,101,5.0 1,102,3.0 1,103,2.5 2,101,2.0 2,102,2.5 2,103,5.0 2,104,2.0 3,101, ...

  4. 入坑python 自己写的小工具,纪念一下

    这个程序的功能是可以从表格中读取某一列数据,传到IDs 这一个参数里,然后在url中获取相应的请求值,并打印 import urllib.request import json import xlrd ...

  5. mysql2

    第三章   保证数据完整性 3.1 数据完整性的概述:实体完整性  域完整性  引用完整性  用户自定义完整性 3.2 数据完整性的实现   3.2.1 创建非空约束  (在定义列后加上  not n ...

  6. Hibernate框架 hilo 方式配置MySQL 数据库的主键自增

    hilo(高低位方式high low)是hibernate中最常用的一种生成方式,需要一张额外的表保存hi的值.保存hi值的表至少有一条记录(只与第一条记录有关),否则会出现错误.可以跨数据库. 创建 ...

  7. java date相关

    public static void getPreDay() throws ParseException{     String dateStr="2013-1-1";     D ...

  8. Linux进程管理四大工具ps \dstat\ top\ htop

    Linux进程管理之“四大名捕” 一.四大名捕 四大名捕,最初出现于温瑞安创作的武侠小说,是朝廷中正义力量诸葛小花的四大徒弟,四人各怀绝技,分别是轻功暗器高手“无情”.内功卓越的高手“铁手”.腿功惊人 ...

  9. [转]Lost parameter value during SQL trace in EF Core DbParameter 为 问号 ?

    本文转自:https://stackoverflow.com/questions/44202478/lost-parameter-value-during-sql-trace-in-ef-core 问 ...

  10. CEF加载FLASH插件时弹出CMD命令行窗口的问题

    这个是flash插件的一个bug,CEF(chromium系列浏览器)关闭sandbox第一次加载flash插件就会跳出这样的一个提示,在Google官方也看到了chromium的issue: 解决方 ...