//
// ZYOperationViewController.h
// Thread
//
// Created by yejiong on 14
//
// ZYOperation.h
// Thread
//
// Created by yejiong on 14/11/4.
// Copyright © 2014年 zzz. All rights reserved.
// #import <Foundation/Foundation.h> @interface ZYOperation : NSOperation @property (nonatomic, copy) NSString* operationName; @end

//
// ZYOperation.m
// Thread
//
// Created by yejiong on 14/11/4.
// Copyright © 2014年 zzz. All rights reserved.
// #import "ZYOperation.h" @implementation ZYOperation - (void)dealloc {
[_operationName release]; [super dealloc];
} //重写 main 方法,在这里写入我们需要在线程中执行的代码。
- (void)main {
// NSLog(@"--------%@", [NSThread currentThread]);
//
// if ([NSThread isMainThread]) {
// NSLog(@"主线程");
// }else {
// NSLog(@"分线程");
// } NSLog(@"%@", _operationName);
} @end
/11/4.
// Copyright © 2014年 zzz. All rights reserved.
// #import <UIKit/UIKit.h> @interface ZYOperationViewController : UIViewController @end
//
// ZYOperationViewController.m
// Thread
//
// Created by yejiong on 14/11/4.
// Copyright © 2014年 zzz. All rights reserved.
// #import "ZYOperationViewController.h"
#import "ZYOperation.h" @interface ZYOperationViewController () {
NSOperationQueue* _operationQueue; } @property (nonatomic, retain) NSBlockOperation* blockOperation1; @end @implementation ZYOperationViewController - (void)dealloc {
[_operationQueue release]; [_blockOperation1 release]; [super dealloc];
} - (void)viewDidLoad {
self.view.backgroundColor = [UIColor whiteColor]; _operationQueue = [[NSOperationQueue alloc] init]; //设置最大并发数,同时最多有多少线程在执行。
_operationQueue.maxConcurrentOperationCount = ; //使用 NSBlockOperation 的时候需要注意是否造成循环引用。
__block ZYOperationViewController* blockSelf = self; self.blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
blockSelf.view.backgroundColor = [UIColor redColor];
}]; //没有造成循环引用。
NSBlockOperation* blockOperation = [NSBlockOperation blockOperationWithBlock:^{
self.view.backgroundColor = [UIColor redColor];
}];
} - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
//NSOperation 是一个抽象类,我们不能使用它的对象,必须使用它子类的对象。
//系统提供了两个子类:NSInvocationOperation,NSBlockOperation。
//我们也可以自定义 NSOperation 子类,重写 mian 方法,然后把 operation 对象添加到 NSOperationQueue 中,就会自动在分线程执行 main 方法。 // [self invocationOperation]; // [self blockOperation];

//自定义
[self customOperation];
} - (void)invocationOperation {
NSInvocationOperation* invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run:) object:@""]; //使用 start 在主线程执行任务。
// [invocationOperation start]; //如果需要在分线程执行任务,把对象添加到 NSOperationQueue,就会自动的在分线程执行任务。 [_operationQueue addOperation:invocationOperation]; [invocationOperation release];
} - (void)blockOperation {
NSBlockOperation* blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"1--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) {
NSLog(@"主线程");
}else {
NSLog(@"分线程");
}
}]; //主线程
// [blockOperation start]; //分线程
// [_operationQueue addOperation:blockOperation]; [blockOperation addExecutionBlock:^{
NSLog(@"2--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) {
NSLog(@"主线程");
}else {
NSLog(@"分线程");
}
}]; [blockOperation addExecutionBlock:^{
NSLog(@"3--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) {
NSLog(@"主线程");
}else {
NSLog(@"分线程");
}
}]; [blockOperation addExecutionBlock:^{
NSLog(@"4--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) {
NSLog(@"主线程");
}else {
NSLog(@"分线程");
}
}]; [blockOperation addExecutionBlock:^{
NSLog(@"5--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) {
NSLog(@"主线程");
}else {
NSLog(@"分线程");
}
}]; //addExecutionBlock,并发的执行多个 block 任务,系统自动分配到当前空闲的线程,可能是主线程也可能是分线程。
// [blockOperation start]; //全部在分线程并发执行。
[_operationQueue addOperation:blockOperation];
} - (void)customOperation {
ZYOperation* operation = [[ZYOperation alloc] init]; operation.operationName = @""; ZYOperation* operation1 = [[ZYOperation alloc] init]; operation1.operationName = @""; ZYOperation* operation2 = [[ZYOperation alloc] init]; operation2.operationName = @""; //设置线程间的依赖关系。让一个线程等待另外一个线程执行完毕再开始执行。
[operation addDependency:operation1]; [_operationQueue addOperation:operation];
[_operationQueue addOperation:operation1];
[_operationQueue addOperation:operation2]; [operation release];
[operation1 release];
[operation2 release]; } - (void)run:(id)object {
NSLog(@"%@", object); if ([NSThread isMainThread]) {
NSLog(@"主线程");
}else {
NSLog(@"分线程");
} //仍然使用这个方法回到主线程。
// self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>
} @end

线程2 NSOperation 抽像类的使用的更多相关文章

  1. 接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)?

    接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)? 1. 接口可以继承接口. 2. 抽像类可以实现(implements)接 ...

  2. php面向对象之抽像类、接口、final、类常量

    一.抽像类(abstract)        在我们实际开发过程中,有些类并不需要被实例化,如前面学习到的一些父类,主要是让子类来继承,这样可以提高代码复用性语法结构:  代码如下 复制代码   ab ...

  3. Java并发包——线程安全的Collection相关类

    Java并发包——线程安全的Collection相关类 摘要:本文主要学习了Java并发包下线程安全的Collection相关的类. 部分内容来自以下博客: https://www.cnblogs.c ...

  4. Java并发包——线程安全的Map相关类

    Java并发包——线程安全的Map相关类 摘要:本文主要学习了Java并发包下线程安全的Map相关的类. 部分内容来自以下博客: https://blog.csdn.net/bill_xiang_/a ...

  5. NSThread 子线程 Cocoa NSOperation GCD(Grand Central Dispatch) 多线程

    单词:thread 英 θred:n 线.思路.vt 穿过.vi 穿透过 一.    进程.线程 进程:正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间 线程: ...

  6. 创建线程方式-NSOperation

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  7. c#跨线程访问控件帮助类

    1.背景 对于winform程序来说,当我们点击按钮,需要消耗一定时长才能拿到数据后才能显示在界面上某个控件上的情况,我们通常会专门开一个线程去拿数据,这样不会造成界面处于假死状态 2.常规做法 // ...

  8. java 之前的安全的类回顾,以及以后需要线程安全时使用哪些类

    之前所学习到的线程安全的类: StringBuffer:线程安全的可变字符序列.一个类似于 String 的字符串缓冲区,但不能修改. Vector:Vector 类可以实现可增长的对象数组. Has ...

  9. JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)

    实现线程并发有两种方式:1)继承Thread类:2)实现Runnable接口. 线程基础 1)程序.进程.线程:并行.并发. 2)线程生命周期:创建状态(new一个线程对象).就绪状态(调用该对象的s ...

随机推荐

  1. (原创)spring mvc和jersey rest 组合使用时单例对像实例化两次的BUG及解决办法

    项目中没用spring 的restTemplate 而是采用 jersey来做rest 的实现,一直用着,也没发现有什么不对,后来加入了,以quartz用硬编码方式实现,结果启动项目的时候报错 ,具体 ...

  2. Things App Engine Doesn't Do...Yet

    当人们第一次使用App Engine的时候,他们会问一些App Engine不会做的事情.其中的一些事情Google在不久的将来会实现的,还有一些违背了App Engine设计的本质,将不可能增加(到 ...

  3. Android 添加系统服务

    原创文章,转载请注明出处:http://blog.csdn.net/t5721654/article/details/7480696 Android系统本身提供了很多系统服务,如WindowManag ...

  4. Apache Spark GraphX的使用简介

    类似 Spark 在 RDD 上提供了一组基本操作符(如 map, f ilter, reduce), GraphX 同样也有针对 Graph 的基本操作符,用户可以在这些操作符传入自定义函数和通过修 ...

  5. 【转】Objective-C代码注释和文档输出的工具和方法

    http://blog.xcodev.com/blog/2013/11/01/code-comment-and-doc-gen-tools-for-objc/ 代码注释可以让代码更容易接受和使用,特别 ...

  6. Delphi使用TStringHash实现建立类(有点像反射)

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  7. [iOS 多线程 & 网络 - 2.11] - ASI框架上传文件

    A.ASI的上传功能基本使用 1.实现步骤 (1)创建请求 使用ASIFormDataRequest (2)设置上传文件路径 (3)发送请求     2.上传相册相片 UIImagePickerCon ...

  8. Spring MVC Framework 注解

    ControllerAdvice Spring MVC Framework会把 @ControllerAdvice注解内部使用 @ExceptionHandler.@InitBinder.@Model ...

  9. SAE搭建WordPress教程 免费建WordPress博客站

    SAE搭建WordPress教程 免费建WordPress博客站 WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设自己的网志.当然,用户也可以 ...

  10. XML操作:2.LINQ TO XML(http://www.cnblogs.com/AlexLiu/archive/2008/10/27/linq.html)

    LINQ to XML 建立,读取,增,删,改   LINQ to XML的出现使得我们再也不需要使用XMLDocument这样复杂的一个个的没有层次感的添加和删除.LINQ可以使的生成的XML文档在 ...