`

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

    博客分类:
  • ios
 
阅读更多

转自 http://www.dreamingwish.com/dream-2012/gcd%E5%AE%9E%E6%88%98%E4%B8%80%EF%BC%9A%E4%BD%BF%E7%94%A8%E4%B8%B2%E8%A1%8C%E9%98%9F%E5%88%97%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84%E9%A2%84%E5%8A%A0%E8%BD%BD.html

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

分享到:
评论

相关推荐

    GCD实战一:使用串行队列实现简单的预加载 - 51CTO.COM1

    总的来说,这段代码展示了如何使用GCD的串行队列实现预加载。通过异步执行任务,可以在不阻塞主线程的情况下进行耗时操作,同时保证任务的执行顺序,这对于优化用户体验至关重要。在实际应用中,开发者可以根据需求...

    GCD实战二:资源竞争 - 51CTO.COM1

    【GCD实战二:资源竞争】是关于Grand Central Dispatch(GCD)在处理多线程中的资源竞争问题的讨论。GCD是Apple开发的一种并行编程技术,它可以帮助开发者更高效地利用多核处理器,通过任务队列和工作线程管理来简化...

    swift-GCD使用大全

    11. **GCD实战示例** 通过`GCD_Demo-master`中的项目,你可以看到如何在实际应用中使用上述知识点,例如并发下载、任务调度、线程同步等。 总的来说,“swift-GCD使用大全”这个资源将带你深入了解GCD,不仅包含...

    多线程开发

    队列分为串行队列(Serial Queue)和并行队列(Concurrent Queue),前者每次只有一个任务执行,后者则允许同时执行多个任务。 2. **调度组(Dispatch Group)**: 调度组用于跟踪一组任务的完成情况。当组内所有...

    iOS开发进阶-完整版

    - GCD(Grand Central Dispatch)原理与应用:串行队列、并行队列的创建与使用。 - NSOperation与NSOperationQueue:了解任务依赖关系管理。 - Run Loop机制:深入理解RunLoop在后台任务执行中的作用。 - **性能...

    iphone笔试题和面试题

    7. **多线程与GCD**:理解线程概念,使用GCD(Grand Central Dispatch)进行并发编程,理解串行队列、并行队列和同步/异步执行的概念。 8. **动画与图形渲染**:了解UIView动画、Core Animation和CALayer,以及...

    ios多线程开发

    队列分为串行队列和并行队列,前者保证任务顺序执行,后者则允许同时执行多个任务。GCD还提供了同步和异步两种提交任务的方式,异步任务不会阻塞当前线程,同步任务则会等待任务完成。 三、NSOperation和...

    2016iOSMultithreadingSourceCode:2016 iOS教程多线程实战视频配套源代码

    有串行队列和并行队列两种,前者保证任务按照添加的顺序执行,后者则可以同时执行多个任务。GCD还提供了同步和异步两种提交任务的方式,异步提交不会阻塞当前线程,而同步提交会等待任务完成后再继续执行。 ...

    Objective-C高级编程 iOS与OS X多线程和内存管理

    2. **GCD(Grand Central Dispatch)**:苹果提供的低级多线程框架,使用Block语法,提供了队列和调度策略,包括串行队列、并行队列以及主队列。 3. **NSThread**:直接创建和管理线程的API,适合对线程有高度定制...

    ConcurrentProgrammingInMacOsXAndIos-英文原版.zip

    读者将学习如何使用Dispatch Queues,包括串行队列、并行队列和主队列,以及如何使用Dispatch Work Items来提交任务。GCD还支持Group、Barrier和Timer,这些都是提高并发效率的重要工具。 然后,书中会讲解...

    Objective-C开发范例代码大全

    - **并行编程**:GCD是Apple提供的多线程解决方案,简化了并发编程,如队列(串行和并行)、同步和异步任务。 5. **UI设计与事件处理** - **UIKit**:Objective-C的主要UI框架,包含各种视图(UIView)、控制器...

    Object-C语言入门教程&代码示例 .zip

    主要类型包括串行队列、并行队列和主队列。 ```objc dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // 执行后台任务 dispatch_sync...

Global site tag (gtag.js) - Google Analytics