转自 http://www.dreamingwish.com/dream-2012/gcd%E5%AE%9E%E6%88%98%E4%B8%80%EF%BC%9A%E4%BD%BF%E7%94%A8%E4%B8%B2%E8%A1%8C%E9%98%9F%E5%88%97%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84%E9%A2%84%E5%8A%A0%E8%BD%BD.html
其主要思路是使用gcd创建串行队列,然后在此队列中先后执行两个任务:1.预加载一个viewController 2.将这个viewController推入
代码如下:
@implementation DWAppDelegate
{
dispatch_queue_t _serialQueue;
UINavigationController *_navController;
}
- (dispatch_queue_t)serialQueue
{
if (!_serialQueue) {
_serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);//创建串行队列
}
return _serialQueue;
}
- (void)prepareViewController
{
dispatch_async([self serialQueue], ^{//把block中的任务放入串行队列中执行,这是第一个任务
self.viewController = [[[DWViewController alloc] init] autorelease];
sleep(2);//假装这个viewController创建起来很花时间。。其实view都还没加载,根本不花时间。
NSLog(@"prepared");
});
}
- (void)goToViewController
{
dispatch_async([self serialQueue], ^{//第二个任务,推入viewController
NSLog(@"go");
dispatch_async(dispatch_get_main_queue(), ^{//涉及UI更新的操作,放入主线程中
[_navController pushViewController:self.viewController animated:YES];
});
});
}
- (void)dealloc
{
dispatch_release(_serialQueue);
[_navController release];
[_window release];
[_viewController release];
[super dealloc];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self prepareViewController];
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
DWViewController *viewController = [[[DWViewController alloc] initWithNibName:@"DWViewController" bundle:nil] autorelease];
viewController.view.backgroundColor = [UIColor blueColor];
_navController = [[UINavigationController alloc] initWithRootViewController:viewController];
self.window.rootViewController = _navController;
[self goToViewController];
[self.window makeKeyAndVisible];
return YES;
}
工程下载:
gcdtest1.zip (23.9 KB, 109 次)
分享到:
相关推荐
GCD实战一:使用串行队列实现简单的预加载 - 51CTO.COM1
GCD实战二:资源竞争 - 51CTO.COM1
GCD的示例源码,使用串行队列实现简单的预加载
IOS中GCD的队列分为串行队列和并行队列,任务分为同步任务和异步任务,他们的排列组合有四种情况,下面分析这四种情况的工作方式。 同步任务,使用GCD dispatch_sync 进行派发任务 - (void)testSync { dispatch_...
GCD 是苹果开发的应对多核编程,本实例总结了 GCD 三种队列的获取和创建,以及两种执行任务的方法。
GCD最全教程异步串行并发多任务依次执行中断附带备注
功能:GCD提供了一个易于使用的、基于任务的并发模型,可以将任务提交给系统,系统会自动管理线程的创建、销毁和调度,以实现最佳的性能和资源利用率。 应用:在iOS和macOS等苹果操作系统中广泛应用于多线程编程,可...
主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行。 提示:如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的...
GCD线程中串行队列并行队列的学习
gcd的基础方法使用,线程和队列的使用 gcd的基础方法使用,线程和队列的使用
在说GCD之前,先说几个核心的概念任务:执行什么操作队列:用来存放任务同步和异步的区别GCD使用步骤一、创建任务二、将任务添加到队列中GCD会自动将队列中的任务取出,放到对应的线程中执行任务的取出遵循队列的...
iOS开发中,有两种常用的方法可以实现延迟执行,一种是使用GCD,另外一种是使用NSRunLoop类中提供的方法。 前言 对初学者来说,GCD似乎是一道迈不过去的坎,很多人在同步、异步、串行、并行和死锁这几个名词的漩涡中...
imagegcd示例源码,GCD实战2:资源竞争
GCD详解Demo 同步异步任务,并行串行队列 同步和异步决定了要不要开启新的线程 同步:在当前线程中执行任务,不具备开启新线程的能力 异步:在新的线程中执行任务,具备...串行:一个任务执行完毕后,再执行下一个任务
运行npm start以在localhost:3000上启动节点服务器分行源代码分为多个分支: master包含基准实施inline-css添加内联CSS并异步加载其余CSS preload添加Web字体预加载codesplitting使用CommonsChunkPlugin和...
Queuer是一个队列管理器,建立在和 (aka GCD)之上。 它使您可以轻松地创建任何异步和同步任务,全部由一个队列管理,只需几行。 这是所有功能的列表: 可在所有Swift兼容平台(甚至Linux)上运行 易于使用 ...
##目的和数据来源 该脚本是为 Coursera“获取和清理数据”课程项目编写的,该项目使用从三星 Galaxy S 智能手机的加速度计收集的数据。 获取数据的站点提供完整说明: : ##Packages used 此脚本使用以下包: ...
UCI HAR 数据集文件夹应位于您的工作目录中并应解压缩使用 cbind 命令,脚本向测试集和训练集添加标签 *使用 rbind 脚本组合测试集和训练集 *脚本加载 dplyr 包并将数据帧转换为本地数据帧以供脚本进一步使用 *将...