`

GCD实战一:使用串行队列实现简单的预加载

    博客分类:
  • ios
阅读更多

转自 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实战二:资源竞争 - 51CTO.COM1

    GCD实战二:资源竞争 - 51CTO.COM1

    gcdtest1示例源码

    GCD的示例源码,使用串行队列实现简单的预加载

    详解IOS串行队列与并行队列进行同步或者异步的实例

    IOS中GCD的队列分为串行队列和并行队列,任务分为同步任务和异步任务,他们的排列组合有四种情况,下面分析这四种情况的工作方式。 同步任务,使用GCD dispatch_sync 进行派发任务 - (void)testSync { dispatch_...

    GCD 总结-队列和任务的理解

    GCD 是苹果开发的应对多核编程,本实例总结了 GCD 三种队列的获取和创建,以及两种执行任务的方法。

    GCD最全教程异步串行并发多任务依次执行中断附带备注

    GCD最全教程异步串行并发多任务依次执行中断附带备注

    Grand Central Dispatch(GCD)介绍要点难点案例分享代码解析

    功能:GCD提供了一个易于使用的、基于任务的并发模型,可以将任务提交给系统,系统会自动管理线程的创建、销毁和调度,以实现最佳的性能和资源利用率。 应用:在iOS和macOS等苹果操作系统中广泛应用于多线程编程,可...

    详解iOS中多线程app开发的GCD队列的使用

    主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行。 提示:如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的...

    GCD线程基础学习资源

    GCD线程中串行队列并行队列的学习

    gcd方法代码测试

    gcd的基础方法使用,线程和队列的使用 gcd的基础方法使用,线程和队列的使用

    iOS-多线程之GCD

    在说GCD之前,先说几个核心的概念任务:执行什么操作队列:用来存放任务同步和异步的区别GCD使用步骤一、创建任务二、将任务添加到队列中GCD会自动将队列中的任务取出,放到对应的线程中执行任务的取出遵循队列的...

    iOS-GCD详解及简单使用

    iOS开发中,有两种常用的方法可以实现延迟执行,一种是使用GCD,另外一种是使用NSRunLoop类中提供的方法。 前言 对初学者来说,GCD似乎是一道迈不过去的坎,很多人在同步、异步、串行、并行和死锁这几个名词的漩涡中...

    imagegcd实例源码

    imagegcd示例源码,GCD实战2:资源竞争

    GCD详解Demo

    GCD详解Demo 同步异步任务,并行串行队列 同步和异步决定了要不要开启新的线程 同步:在当前线程中执行任务,不具备开启新线程的能力 异步:在新的线程中执行任务,具备...串行:一个任务执行完毕后,再执行下一个任务

    gcd-demo:一个演示应用程序,说明前端性能修复

    运行npm start以在localhost:3000上启动节点服务器分行源代码分为多个分支: master包含基准实施inline-css添加内联CSS并异步加载其余CSS preload添加Web字体预加载codesplitting使用CommonsChunkPlugin和...

    队列器:队列器是一个队列管理器,建立在OperationQueue和Dispatch(aka GCD)之上

    Queuer是一个队列管理器,建立在和 (aka GCD)之上。 它使您可以轻松地创建任何异步和同步任务,全部由一个队列管理,只需几行。 这是所有功能的列表: 可在所有Swift兼容平台(甚至Linux)上运行 易于使用 ...

    GCD_CP:Coursera 获取和清理数据 - 课程项目

    ##目的和数据来源 该脚本是为 Coursera“获取和清理数据”课程项目编写的,该项目使用从三星 Galaxy S 智能手机的加速度计收集的数据。 获取数据的站点提供完整说明: : ##Packages used 此脚本使用以下包: ...

    GCD_CourseProject:课程项目作业文件

    UCI HAR 数据集文件夹应位于您的工作目录中并应解压缩使用 cbind 命令,脚本向测试集和训练集添加标签 *使用 rbind 脚本组合测试集和训练集 *脚本加载 dplyr 包并将数据帧转换为本地数据帧以供脚本进一步使用 *将...

Global site tag (gtag.js) - Google Analytics