您的位置:首页 > 移动开发 > IOS开发

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

2013-01-10 22:16 736 查看
其主要思路是使用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: