GCD实战一:使用串行队列实现简单的预加载
2013-01-21 14:56 三戒1993 阅读(102) 评论(0) 编辑 收藏 举报
其主要思路是使用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, 133 次)