斯坦福iOS教程:GCD与Block解析

5星 · 超过95%的资源 需积分: 10 54 下载量 201 浏览量 更新于2024-07-25 3 收藏 5.32MB PDF 举报
"斯坦福iOS教程中的GCD和Block技术" 在iOS开发中,Grand Central Dispatch(GCD)和Block是两个非常重要的概念,尤其在处理多线程和并发问题时发挥着关键作用。本教程源于斯坦福大学的CS193p课程,专注于为iPhone、iPod Touch和iPad开发应用程序。 Block,也称为闭包,是一种可以在代码中声明的函数,允许你“即时”定义一段代码。它能够内联地与调用方法一起使用,并且智能地处理局部变量和引用的对象。Block的语法以一个caret字符"^"开头,接着是可选的参数列表(用括号括起来),然后是代码体(用大括号"{}"包围)。例如,下面的代码展示了如何使用Block遍历字典并打印键值对,同时提供了一个停止条件: ```objc [aDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { NSLog(@"value for key %@ is %@", key, value); if ([@“ENOUGH” isEqualToString:key]) { *stop = YES; } }]; ``` 这个Block会在每次迭代时打印出字典中的键和值,直到遇到键为"ENOUGH"时停止。Block内的`stop`指针可以被用来控制循环的终止。 GCD是Apple引入的一个低级库,用于简化多线程编程。它通过队列管理任务,使得开发者无需关心线程的创建和销毁,而是关注任务本身。GCD提供了串行队列和并行队列两种类型,前者会按顺序执行任务,后者则会同时执行多个任务(取决于系统资源)。你可以将Block提交到这些队列,GCD会自动调度执行。 例如,如果你想要在后台线程中执行一个耗时操作,可以这样使用GCD: ```objc dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 耗时操作 // ... dispatch_async(dispatch_get_main_queue(), ^{ // 更新UI // ... }); }); ``` 这段代码将Block添加到了全局并发队列,使得操作在后台执行,完成后又在主线程中更新用户界面,确保了UI操作的线程安全。 Block的一个重要特性是可以捕获和使用其定义范围内的局部变量,即使在Block外部执行。比如在Block内部可以直接访问并修改在它之前声明的`stopValue`变量: ```objc double stopValue = 53.5; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // Block代码可以访问并使用stopValue NSLog(@"stopValue: %f", stopValue); }); ``` Stanford CS193p课程中的GCD和Block部分,主要介绍了如何利用Block的便利性和GCD的强大功能来编写更高效、更易于管理的多线程代码,这对于iOS开发者来说是非常基础且至关重要的技能。学习和掌握这两个概念,能让你的iOS应用在性能和用户体验上得到显著提升。