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

本文介绍如何使用 GCD (Grand Central Dispatch) 创建串行队列来实现 viewController 的预加载,通过两个步骤:首先预加载 viewController,然后将其推入导航控制器。此方法能够简化加载过程并提高用户体验。
摘要由CSDN通过智能技术生成

转自 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 次)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值