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. json list数据递归生成树状层级JSON

    <!DOCTYPE html> <html> <head> <script> var data=[ {"id":"aaa& ...

  2. 反应器(Reactor)模式

    Java NIO非堵塞技术实际是采取反应器模式,或者说是观察者(observer)模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/ ...

  3. IOS第三方之MBProgressHUD

    // // ViewController.m // MBProgressHUD // // Created by City--Online on 15/6/15. // Copyright (c) 2 ...

  4. [转]数据库中Schema(模式)概念的理解

    在学习数据库时,会遇到一个让人迷糊的Schema的概念.实际上,schema就是数据库对象的集合,这个集合包含了各种对象如:表.视图.存储过程.索引等. 如果把database看作是一个仓库,仓库很多 ...

  5. 我用ASP.NET缓存之SQL数据缓存依赖(SqlCacheDependency)

    [名词解释] 缓存(Cache)依赖,大白话解释就是缓存是否更新依赖于其它Object.那么SqlCacheDependency指的就是Cache的数据更新依赖于SQL Server数据库表的变化(  ...

  6. Tomcat启动慢原因之一 At least one JAR was scanned for TLDs yet contained no TLDs

    Tomcat启动时提示: 信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging f ...

  7. Node.js从入门到实战ECMAScript6一页纸总结(很大的一页纸)

    一.ES5/ES6和babel ECMAScript5,即ES5,是ECMAScript的第五次修订,于2009年完成标准化,现在的浏览器已经相当于完全实现了这个标准.ECMAScript6,即ES6 ...

  8. c#无边窗体实现移动的两种方式

    转载:http://blog.csdn.net/dxsh126/article/details/2940226 首先,要用到一个WimdowsAPI函数,因此必须引入 using System.Run ...

  9. AGC008E:Next or Nextnext

    传送门 考虑转化成图论问题,\(i\) 向 \(p_i\) 连边,那么合法方案一定是形成了若干个简单环或自环 考虑一个环内的情况: 如果 \(a_i=p_i\),那么 \(i\) 向 \(a_i\) ...

  10. Js如何调用本地应用程序

    一般情况下,浏览器中是无法直接和本机的其他的程序进行交互的,在IE中,我们可以通过ActiveX对象的方式进行.但是这个方式只适用于IE浏览器,另一种比较通用的方式便是URL协议的方式,我们将某种UR ...