GCD实战一:使用串行队列实现简单的预加载

来源:互联网 发布:网络贷款不还会怎么样 编辑:程序博客网 时间:2024/05/01 14:25


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

原创粉丝点击