//
// 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. IO-同步,异步,阻塞,非阻塞,阅读摘要

    http://www.cnblogs.com/Fly-Wind/p/io.html http://blog.csdn.net/historyasamirror/article/details/5778 ...

  2. windows防火墙无法启动,服务不存在

    系统的防火墙无法启动,系统服务里面也没有防火墙的服务,用下面第一种方法,导 入注册表,重启服务器,在服务里面有防火墙的服务了,然后启动就好了,需要重新配置防火墙 在控制面板中启动防火墙的时候提示无法识 ...

  3. UVALive 7457 Discrete Logarithm Problem (暴力枚举)

    Discrete Logarithm Problem 题目链接: http://acm.hust.edu.cn/vjudge/contest/127401#problem/D Description ...

  4. POJ 1502 MPI Maelstrom(最短路)

    MPI Maelstrom Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4017   Accepted: 2412 Des ...

  5. codeforces 630J Divisibility

    J. Divisibility time limit per test 0.5 seconds memory limit per test 64 megabytes input standard in ...

  6. 从工程中删除Cocoapods

    从工程中删除Cocoapods 分类: Xcode iOS 2013-08-24 01:11 5512人阅读 评论(2) 收藏 举报 CocoapodsiOSXcode 1. 删除工程文件夹下的Pod ...

  7. C/C++ 不带参数的回调函数 与 带参数的回调函数 函数指针数组 例子

    先来不带参数的回调函数例子 #include <iostream> #include <windows.h> void printFunc() { std::cout<& ...

  8. rqnoj-105-核电站问题-dp

    刚刚发现一个问题..原来这个oj叫rqnoj不是rnqoj... 简单的状态转换~~ #include<stdio.h> #include<string.h> #include ...

  9. UI进阶 CocoaPods的安装使用步骤

    一. CocoaPods简介 CocoaPods是一个用来帮助我们管理第三方依赖库的工具.在开发iOS应用时,会经常使用第三方类库,比如SDWebImage.AFNetworking等等,手动的下载与 ...

  10. Java中重写与重载的辨析

    摘要:在我们学习Java过程中,重写与重载使我们在面向对象里要学习的重要知识点之一,那我们看看它们有那些区别: 一.重写 1.概念:简单的说就是子类将从父类继承而来的方法重新实现一次. 2.特点: ① ...