用Swift構建一個簡略的iOS郵件運用的辦法。本站提示廣大學習愛好者:(用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寫的樣例。
我們的第一個Swift例子,我想寫一個簡略的app,它就像一個魔幻8球:
(譯者注:文中的thread其實不是線程的意思,在服裝論壇t.vhao.net中的一個帖子叫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 讓我們從Inbox同步引擎獲得郵件數據變得簡略起來。我們實例化一個 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()
}
}}
在後台,-markAsReadqueues這個辦法使新的API舉措進入隊列,經由過程這類行動來從線程中移除未讀標簽。 INThread對象和當地存儲的數據會被連忙更新,然則這個舉措將會在手機上列隊,直到可以樹立
銜接。假如辦事器謝絕此次的舉措,那末當地的數據也會回滾。
我們不須要刷新我們的線程供給者-我們的任務曾經完成!假如以後線程被標志為已讀,那末它就不再須要知足我們線程供給者成果集的尺度.供給者會主動
婚配它的內容,而且挪用providerDataChanged辦法,我們完成的署理辦法將會刷新我們顯示,來展示新聚集中的第一個線程。
接上去的步調
好了! 只用了幾十行代碼,我們就創立了一個示例法式,它可以從我們的收件箱一條條的獲得線程,而且讓我們標志為已讀.如今它僅僅須要點動畫和潤飾.你可以從這裡檢查demo的源碼:
: SwiftEightBall Sample App
我們僅僅接觸了InboxKit的一些淺易的器械.在IOS SDK的下層創立我們的swift運用,這意味著我們須要為模子獲得當地類的支撐,好比線程和通信錄,
和由於支撐延時線程和新聞舉措的SQLite而變得更壯大的離線緩存.
看看iOS SDK documentation 進修一下更多關於在郵件下層創立雅觀年夜方運用的常識.