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 ...
随机推荐
- c#3位一分(money)
NumberFormatInfo num = new NumberFormatInfo(); num.NumberDecimalDigits = 2; string ...
- MSMQ(消息队列)续
在上一篇我简单介绍了MSMQ的相关概念,本篇将以代码说明 Message Message是MSMQ的数据存储单元,我们的用户数据一般也被填充在Message的body当中,因此很重要,让我们来看一看其 ...
- jsp 获取表单值, 提交类型为multipart/form-data处理
//tt.jsp<script type="text/javascript"> function doSubmit(){ alert("aaaaaa" ...
- Java 内存结构备忘录
本文详细描述了 Java 堆内存模型,垃圾回收算法以及处理内存泄露的最佳方案,并辅之以图表,希望能对理解 Java 内存结构有所帮助.原文作者 Sumith Puri,本文系 OneAPM 工程师编译 ...
- python繁体中文到简体中文的转换
处理中文字符串遇到了繁体和简体中文的转换,python版: 1.下载zh_wiki.py及langconv zh_wiki.py:https://github.com/skydark/nstool ...
- 【NOIP 2016 总结】
距离杯赛已经很久了,然而我现在才打总结.. 我好惨的说..两场才380... DAY 1 第一题 toy 送分题,模拟的时候+一下再mod一下就好. [当时打完这题就没再看一眼了,好方的说] #inc ...
- [topcoder]FlowerGarden
1.此题很勉强算DP.找了半天网上思路,是个三层的循环,n^3.2.基本思路就是先找到在第一个位置的花.这样就双层遍历,找到所有和其他不冲突的花中最高的一个,然后放到结果的首位.然后去掉此花,继续使用 ...
- Qt读写二进制文件
http://blog.csdn.net/mjlsuccess/article/details/22194653 http://www.cnblogs.com/weiweiqiao99/archive ...
- Linux如何在虚拟机中挂载iso yum源
首先,将作为源的iso的挂载到系统上. 代码如下: mount -o loop /dev/cdrom /mnt/iso/ 或者 mount -o loop /xxx/xxx.iso /mnt/iso/ ...
- MySQL相关知识
字符串拼接 select * from tablename where mydata like CONCAT(CURDATE(), '%') limit 3 这里concat是字符串拼接, conca ...