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 ...
随机推荐
- setPreferredSize和setSize的区别及用法
我以前很喜欢borderlayout的布局方式,每次想特别调整每个区域的大小,但是每次将一个panel放入到north或者其他4个区域时,总是达不到想要的效果,刚刚才发现原来setPreferredS ...
- 实现WebApp直接调起NativeApp
原文http://www.baidufe.com/item/3444ee051f8edb361d12.html 试了一个小Demo,从WebApp上直接调起Android Native App,包括应 ...
- centos7安装chrome及加载poatman开发插件
为什么要安装chrome?因为centos7的默认浏览器firefox的实在是不习惯,上面占了太多,本来显示器就不大... 好了,首先下载chome的rpm安装包(如果需要的可以留言,我有备份) 然后 ...
- ntpServer搭建用以进行时间同步
在试各种乱七八糟的集群中,突然发现了一个问题,假如在一个闭网环境下安装某些集群软件的时候服务器之间的时间不同步(如HBase),会导致启动失败.那么就需要进行时间同步.可是往常都是网络校准的,没网的集 ...
- HDU4608+模拟
简单的模拟题. 暴力枚举 /* 模拟 */ #include<algorithm> #include<iostream> #include<string.h> #i ...
- HDU4611+数学
/* 找规律 题意:abs(i%A - i%B) 对i从0~N-1求和 从0~N-1一个一个算必TLE,着A,B两者差相同的部分合并起来算 */ #include<stdio.h> #in ...
- hdu 2147 kiki's game 博弈论
找规律的博弈论!! 很容易发现当n,m都为奇数时先手必败! 代码如下: #include<iostream> #include<stdio.h> #define I(x,y) ...
- 【BZOJ 3190】 3190: [JLOI2013]赛车 (半平面交)
3190: [JLOI2013]赛车 Description 这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2--gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进ki的位 ...
- Why it is good practice to declare loggers private, static, and final?
// Jakarta Commons Loggingprivate static final Log log = LogFactory.getLog(MyClass.class);The above ...
- mmap
http://www.360doc.com/content/11/0830/10/1964482_144428042.shtml