zoukankan      html  css  js  c++  java
  • 深入GCD(四):使用串行队列实现简单的预加载

    其主要思路是使用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;
    }

  • 相关阅读:
    Redis 学习之路 (009)
    树莓派进阶之路 (012)
    树莓派进阶之路 (011)
    树莓派UFW防火墙简单设置
    树莓派进阶之路 (002)
    Redis学习之路(008)- Redis C语言客户端库hiredis文档翻译
    Redis学习之路(007)- Redis学习手册(实例代码)
    树莓派进阶之路 (000)
    Redis学习之路(006)- Redis学习手册(Hashes数据类型)
    Redis学习之路(005)- redis内存数据库C客户端hiredis API 中文说明
  • 原文地址:https://www.cnblogs.com/yingkong1987/p/3148873.html
Copyright © 2011-2022 走看看