转自 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的串行队列实现预加载。通过异步执行任务,可以在不阻塞主线程的情况下进行耗时操作,同时保证任务的执行顺序,这对于优化用户体验至关重要。在实际应用中,开发者可以根据需求...
【GCD实战二:资源竞争】是关于Grand Central Dispatch(GCD)在处理多线程中的资源竞争问题的讨论。GCD是Apple开发的一种并行编程技术,它可以帮助开发者更高效地利用多核处理器,通过任务队列和工作线程管理来简化...
11. **GCD实战示例** 通过`GCD_Demo-master`中的项目,你可以看到如何在实际应用中使用上述知识点,例如并发下载、任务调度、线程同步等。 总的来说,“swift-GCD使用大全”这个资源将带你深入了解GCD,不仅包含...
队列分为串行队列(Serial Queue)和并行队列(Concurrent Queue),前者每次只有一个任务执行,后者则允许同时执行多个任务。 2. **调度组(Dispatch Group)**: 调度组用于跟踪一组任务的完成情况。当组内所有...
- GCD(Grand Central Dispatch)原理与应用:串行队列、并行队列的创建与使用。 - NSOperation与NSOperationQueue:了解任务依赖关系管理。 - Run Loop机制:深入理解RunLoop在后台任务执行中的作用。 - **性能...
7. **多线程与GCD**:理解线程概念,使用GCD(Grand Central Dispatch)进行并发编程,理解串行队列、并行队列和同步/异步执行的概念。 8. **动画与图形渲染**:了解UIView动画、Core Animation和CALayer,以及...
队列分为串行队列和并行队列,前者保证任务顺序执行,后者则允许同时执行多个任务。GCD还提供了同步和异步两种提交任务的方式,异步任务不会阻塞当前线程,同步任务则会等待任务完成。 三、NSOperation和...
有串行队列和并行队列两种,前者保证任务按照添加的顺序执行,后者则可以同时执行多个任务。GCD还提供了同步和异步两种提交任务的方式,异步提交不会阻塞当前线程,而同步提交会等待任务完成后再继续执行。 ...
2. **GCD(Grand Central Dispatch)**:苹果提供的低级多线程框架,使用Block语法,提供了队列和调度策略,包括串行队列、并行队列以及主队列。 3. **NSThread**:直接创建和管理线程的API,适合对线程有高度定制...
读者将学习如何使用Dispatch Queues,包括串行队列、并行队列和主队列,以及如何使用Dispatch Work Items来提交任务。GCD还支持Group、Barrier和Timer,这些都是提高并发效率的重要工具。 然后,书中会讲解...
- **并行编程**:GCD是Apple提供的多线程解决方案,简化了并发编程,如队列(串行和并行)、同步和异步任务。 5. **UI设计与事件处理** - **UIKit**:Objective-C的主要UI框架,包含各种视图(UIView)、控制器...
主要类型包括串行队列、并行队列和主队列。 ```objc dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // 执行后台任务 dispatch_sync...