IOS 多线程 NSOperation GCD
1.NSInvocationOperation
NSInvocationOperation * op;
NSOperationQueue * que = [[NSOperationQueuealloc]init];
op = [[ NSInvocationOperationalloc]initWithTarget:selfselector:@selector(run:) object:@"aaa"];
[que addOperation:op];
// 这里不要使用 op start,否则就会出现住线程阻塞的现象。 默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作。只有将operation放到一个NSOperationQueue中,才会异步执行操作。
-(void)run:(id)data
{
while (![op isCancelled])
{
[NSThreadsleepForTimeInterval:1];
NSLog(@"run");
}
}
通过 [op cancel]; 来停止线程
2.
__block NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^(){
while ( ![op isCancelled])
{
[NSThread sleepForTimeInterval:0.3];
NSLog(@"cccc");
}
}];
NSOperationQueue * que = [[NSOperationQueuealloc]init];
[que addOperation:op];
这里也需要通过 queue来控制,使用start的话也会造成阻塞。
这里的 op 需要使用 __block 来控制,因为在^(){}里面用到,否则不对。
3.自定义 NSOperation
#import <Foundation/Foundation.h>
@interface MyOperation : NSOperation
@end
#import "MyOperation.h"
@implementation MyOperation
-(void)main
{
@autoreleasepool
{
while ( YES )
{
[NSThreadsleepForTimeInterval:0.3];
if( [self isCancelled] )
break;
NSLog(@"aaaaaa");
}
}
}
// 如何调用
-(void)aaaa
{
static BOOL bFlog = NO;
if( !bFlog )
{
_op = [[MyOperation alloc]init];
NSOperationQueue * que = [[NSOperationQueuealloc]init];
[que addOperation:_op];
}
else
{
[_op cancel];
}
bFlog = YES;
}
3. GCD
dispatch_async(dispatch_get_global_queue(0, 0), ^(void){
for( NSInteger index = 0; index < 10; ++ index )
{
[NSThreadsleepForTimeInterval:0.3];
NSLog(@"index:%d",index);
dispatch_async(dispatch_get_main_queue(), ^(void){
_label.text = [NSString stringWithFormat:@"index:%d",index];
});
}
});
IOS 多线程 NSOperation GCD的更多相关文章
- iOS 多线程 之 GCD(大中枢派发)(一)
导语: 本文个人原创,转载请注明出处(http://www.cnblogs.com/pretty-guy/p/8126981.html) 在iOS开发中多线程操作通常是一下3种,本文着重介绍Dispa ...
- [iOS]多线程和GCD
新博客wossoneri.com 进程和线程 进程 是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分别 ...
- iOS多线程 NSThread/GCD/NSOperationQueue
无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...
- iOS 多线程 NSOperation、NSOperationQueue
1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperationQueue 是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.N ...
- iOS多线程 NSOperation的用法
上一篇写了 GCD 的使用,接下来就了解一下 NSOperation ,NSOperation是苹果对 GCD 的 OC 版的一个封装,但是相对于GCD来说可控性更强,并且可以加入操作依赖. NSOp ...
- IOS多线程(GCD)
简介 Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首次 ...
- iOS多线程--NSOperation 浅显易懂
NSOperation是基于GCD的一套多线程实现方案,和GCD一样,线程的生命周期是由系统来自动管理的,不用像NSThread和Pthread一样让程序员手动管理.相对于GCD来说,它更加地面向对象 ...
- iOS多线程--NSOperation
NSOperation是基于GCD的一套多线程实现方案,和GCD一样,线程的生命周期是由系统来自动管理的,不用像NSThread和Pthread一样让程序员手动管理.相对于GCD来说,它更加地面向对象 ...
- iOS多线程---NSOperation介绍和使用
1. NSOperation实现多线程编程,需要和NSOperationQueue一起使用. (1)先将要执行的操作封装到NSOperation中 (2)将NSOperation对象添加到NSOpe ...
随机推荐
- Experience all that SharePoint 15 has to offer. Start now or Remind me later.
$spSite = Get-SpSite($waUrl); $spSite.AllowSelfServiceUpgrade = $false
- storyboard 总结
1.storyboard 布局时用代码实现页面跳转: a> 获取当前 storyboard : [self storyboard] b> 为将要跳转到的 viewController 添加 ...
- jq获取元素到底部的距离
// var wh = $(window).height(),//是文档窗口高度 // ot = $("#icoimg").offset().top,//是标签距离顶部高度 // ...
- uc/os任务创建
问题描述: uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...
- 斯坦福数据挖掘Introduction
感谢敖山.薛霄老师把我引进了统计学和现代服务业的大门.......至少是长见识了. 查相似项检索时发现的. 中间一部分资料来自厦门大学数据库实验室,感谢大牛们的传道授业,爱你们. 查资料时发现很多计算 ...
- Quartz任务调度快速入门(转)
概述 了解Quartz体系结构 Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器.任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的这些核心概念进行描述: ●Jo ...
- DeepFace--Facebook的人脸识别(转)
DeepFace基本框架 人脸识别的基本流程是: detect -> aligh -> represent -> classify 人脸对齐流程 分为如下几步: a. 人脸检测,使用 ...
- 学习笔记:shared_ptr陷阱
条款1:不要把一个原生指针给多个shared_ptr管理 int* ptr = new int; shared_ptr<int> p1(ptr); shared_ptr<int> ...
- 16进制字符串转数字(C/C++,VB/VB.net,C#)
这个问题看是很简单,但是在不同语言中实现的方式却千差万别,如果不知道方法,还真是麻烦,我就是在C#中遇到该问题,让我费了很大的周折,才在msdn查到. 一.16进制字符串转数字 1.C/C+ ...
- POJ3297+map字符串处理
简单的字符串处理题. 要注意细节! 附数据两组: ABCC abc ae AAA abc AAAA abc A a B a C a /* */ #include<stdio.h> #inc ...