使用 Swift 构建一个 iOS 的邮件应用

使用 Swift 构建一个 iOS 的邮件应用

在前几个月内,我一直在做InboxKit的研究,它是关于Inbox平台的IOS SDK。Inbox为和邮件数据的交互提供高层API,使得你可以忽略IMAP,Exchange,MIME的解析以及thread探测(当然还有很多其他事情...),并使你致力于完成富有创意的APP的创作上。我们的目标很简单:尽可能地打造一个优雅的,跨提供商的邮件应用。毕竟,它很难。

在Objective-C中,InboxKit使得创建邮件体验变得很轻松,那么,Swift又如何呢?Swift在WWDC后已正式被IOS社区所采纳,我认为以后的SDK设计肯定会包括既有Objective-C又有Swift写的样例。

Ubuntu下Swift多节点安装测试小结

Objective-C 开发者对 Swift 亮点的点评

OpenStack Swift安装配置相关整理

在终端中运行 Swift 程序

我们的第一个Swift例子,我想写一个简单的app,它就像一个魔幻8球:

显示Inbox中未读thread

当你摇动手机,标记thread为已读并显示新的thread

使用 Swift 构建一个 iOS 的邮件应用

(译者注:文中的thread并不是线程的意思,在论坛中的一个帖子叫thread,回复叫post.这里可理解为一封邮件)

在 Swift 中使用 Objective-C SDK

InboxKit有6000行Objective-C代码,我们还不打算把他们都转换成Swift。为了编译我们的Swift邮件应用,我更新了open-source SDK,包含了“Xcode 6 自定义框架“。自定义框架是Xcode6的新特色-支持第三方框架的创建和分发。当DEFINES_MODULE标志设置为可用时,自定义框架会自动为Swift准备Objective-C模块的头文件。在Swift编译时,它会读取这个模块头文件,把Objective-C的类和方法映射到Swift。

Cocoa Touch框架包含这个SDK之后,在Swift中使用很简单。比如我创建了一个新的Swift应用,只需要把这个SDK拖入工程中,然后在root view controller中添加import InboxKit

Xcode 6 自定义框架非常棒, 可是目前只有Xcode 6和iOS 8支持. 如果你正在开发一款应用程序, 你仍然可以选择pod InboxKit。

查看邮件

InboxKit 让我们从获取邮件数据变得简单起来。我们实例化一个 INThreadProvider ,以此展示来自我们邮箱账号的线程,并且具象化需要的数据。供应者模型 是InboxKit的一个核心概念: 他们被用于获取线程,信息,联系人和更多东西的集合 。供应者有点类似于Core Data中的 NSManagedObjectContext 和 YapDatabase的视图——他们把复杂的东西封装在内部,只是暴露出一个结果集,这个结果集是基于你提供的配置。 在InboxKit,供应者从本地SQLite store拉取缓存数据,同时,让对于Inbox API 的询问变得透明。

我们的应用将展示来自Inbox的未读线程,每次一个,所以我们这样定义线程供应者:

var provider:INThreadProvider! = namespace?.newThreadProvider();

provider.itemFilterPredicate = NSComparisonPredicate(format: "ANY tagIDs = %@", INTagIDInbox)

provider.itemSortDescriptors = [NSSortDescriptor(key: "lastMessageDate", ascending: false)]

provider.delegate = self

 

self.threadProvider = provider

由于我们已经创建了一个线程供应者,我们就可以使用它的条目数组来存放我们的视图. 供应者不会同步获取结果集, 所以我们需要实现INModelProviderDelegate协议并监听更新. 当新的线程通过以下方式被创建的时候,供应者会调用-providerDataChanged 方法,这些创建新线程的方式包括:1.从缓存从获取 2.通过API加载 3.(某个时间)通过网络数据包被推送到应用. 实现协议确保了我们的应用总是显示最新的数据.

还有其他一些代理方法,比如 providerDataAltered:它让基于UICollection或者
UITableView创建邮箱用户界面变得更简单,同时可以使用各种插入删除动画效果.但是目前,我们继续看一些基础的东西.

func refreshInterface() {

var items = self.threadProvider!.items

 

if items.count == 0 {

// display empty state self.subjectLabel.text = "No unread threads!"

self.snippetLabel.text = ""

self.participantsLabel.text = ""

self.dateLabel.text = ""

}

 

if let thread = items[0] as? INThread {

// display the thread self.subjectLabel.text = thread.subject

self.snippetLabel.text = thread.snippet

self.dateLabel.text = formatter.stringFromDate(thread.lastMessageDate);

 

....

}}func providerDataChanged(provider: INModelProvider!) {

self.refreshInterface()}func provider(provider: INModelProvider!, dataFetchFailed error: NSError!) {

self.displayError(error);}

标记为已读

在我们的 swift 示例程序中,我们要在用户摇动手机的时候,把当前线程标记为已读,并且显示一个新的线程。用InboxKit,标记为已读是非常简单的。

override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent!) {

if (motion == UIEventSubtype.MotionShake) {

var items = self.threadProvider!.items

if let thread = items[0] as? INThread {

thread.markAsRead()

}

}}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/65b321d1404d17268508e4653e7e3976.html