本文为大家介绍了如何使用串行队列实现简单的预加载,思路是使用gcd创建串行队列,然后在此队列中先后执行两个任务:1.预加载一个viewController 2.将这个viewController推入。文章最后提供了源码下载,希望对各位有所帮助。
其主要思路是使用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;
- }
工程下载: