其主要思路是使用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; }
工程下載: