iOS系统GCD学习(11):使用串行队列实现简单的预加载

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

你可能感兴趣的:(GCD)