65.9K
CodeProject 正在变化。 阅读更多。
Home

iOS 4 实战 - 使用 Grand Central Dispatch (GCD) 获取事件

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (1投票)

2011 年 5 月 26 日

CPOL

3分钟阅读

viewsIcon

19713

《iOS 4 实战》的章节摘录 - 使用 Grand Central Dispatch (GCD) 获取事件

image002.jpg iOS 4 实战
开发 iPhone 和 iPad 应用

作者:Jocelyn Harrington, Brandon Trebitowski, Christopher Allen, and Shannon Appelcline

尽管 iOS 设备上没有多核处理器,但 Grand Central Dispatch 可以帮助应用程序运行得更快、更有效、更异步。本文基于 iOS 4 实战的第 16 章,作者展示了如何使用 GCD 来获取事件。

www.manning.com 结账时使用促销代码 jharrington1635 即可享受下次购买 35% 的折扣。

您可能还对以下内容感兴趣…

Grand Central Dispatch (GCD) 在 Mac OS 上可用,是对多核硬件技术上并发代码执行支持的全面改进。现在,它作为 C API 在 iOS 4 上可用。尽管 iOS 设备上没有多核处理器,但 GCD 可以帮助应用程序运行得更快、更有效、更异步。 您可以从 iOS 开发者网站的并发编程指南中找到更多参考。 让我们看看 GCD 并使用它来获取事件。

它是如何工作的?

GCD 可用于任何应用程序,无需添加任何其他框架。 您可以想象您拥有操作队列,并且每个队列都由系统在自己的线程中单独运行。 您不必担心何时运行耗时的操作。 系统会处理顺序并确保完成队列的操作。

为了保持应用程序的响应性,关键概念是不阻塞主线程。 将耗时的任务(例如从日历数据库中获取事件列表或从 Internet 下载图像文件)抛到后台线程。 然后,在后台工作完成后更新 UI,并且数据已准备好显示。

如何使用 GCD 完成此任务? 事实证明,这非常容易。 只需调用 dispatch_async() 方法,将操作队列(代码块)提交到主队列,并在调度队列上异步执行任务,然后告诉系统更新 UI。

dispatch_async() 的定义如下:

void dispatch_async( dispatch_queue_t queue,
                  dispatch_block_t block
);

我们如何创建队列或获取主队列? 以下是一些与 GCD 相关的常用方法

  • 创建队列:dispatch_queue_t dispatch_queue_create(const char *label, NULL);
  • 释放队列:void dispatch_release(dispatch_queue_t);
  • 获取主队列:dispatch_queue_t dispatch_get_main_queue();

请不要忘记在使用方法 dispatch_queue_create() 创建队列时释放它。

有了 GCD 和 blocks,让我们看看如何创建一个队列来获取事件操作,让系统决定何时运行这个队列,然后在主线程中更新 UI。

使用 GCD 获取事件

让我们使用 GCD 和 blocks 获取整个月的事件并更新表视图显示。

列表 1 使用 GCD 获取事件

-(void)fetchEventsForNextMonth {
    NSDate *startDate = [NSDate date];
    NSDate *endDate = [NSDate dateWithTimeIntervalSinceNow:60*60*24*30];
    NSPredicate *predicate = [self.eventStore predicateForEventsWithStartDate:startDate endDate:endDate calendars:eventStore.calendars]; 
    dispatch_queue_t fetching_queue= 
dispatch_queue_create("Fetching events", NULL);#1
    dispatch_async(fetching_queue, ^{                      #2
           NSArray *eventList = 
[self.eventStore eventsMatchingPredicate:predicate];
           dispatch_async(dispatch_get_main_queue(), ^{    #3
                  [self.events addObjectsFromArray:eventList];
                  [self.tableView reloadData];
           });
    });
dispatch_release(fetching_queue); #4
}
#1 Defines a custom queue
#2 Fetches events 
#3 Updates UI
#4 Releases queue

在列表 1 中,我们首先创建一个自定义队列 (#1)。 GCD 函数开始 (#2)。 操作块将首先在调度队列上执行自定义任务,以从日历数据库中获取事件。 当 eventList 数组准备好时,我们想在主队列调度上使用新数据更新表视图的 UI。 该块 (#3) 首先更新 events 数组,然后重新加载表视图的数据。 最后,不要忘记释放队列 (#4)。 只需按照设计流程即可; GCD 将自动完成任务并异步提供快速响应。

正如您从示例中看到的,只需几行代码,您就可以在后台执行任务,并在新数据准备就绪时更新 UI。 这就是 GCD 和 blocks 的力量。

摘要

Event Kit 框架提供了一个接口,用于访问用户设备上的日历事件。 您可以使用此框架获取现有事件并将新事件添加到用户的日历中。 使用 GCD,应用程序的性能得到显着提高,尤其是在异步从日历数据库获取事件时。

您可能还会对以下 Manning 图书感兴趣:

image003.jpg

iPhone Objective-C
Christopher K. Fairbairn 和 Collin Ruffenach

image004.jpg

iPhone 开发实践
Bear P. Cahill

image005.jpg

解锁 Android,第二版
W. Frank Ableson 和 Robi Sen

© . All rights reserved.