本節書摘來自異步社群《ios 6進階開發手冊(第4版)》一書中的第2章,第2.3節秘訣:監測documents檔案夾,作者 【美】erica sadun,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
2.3 秘訣:監測documents檔案夾
ios 6進階開發手冊(第4版)
ios文檔并沒有受困在它們的沙盒中,你可以并且應該與使用者共享它們。應該允許使用者直接控制他們的文檔,以及通路他們可能在裝置上建立的任何資料。一個簡單的info.plist設定将使itunes能夠顯示使用者的documents檔案夾的内容,并使那些使用者能夠根據需要添加和删除資料。
在将來某個時間,你可能使用一個簡單的nsmetadataquery監測器來監視documents檔案夾并報告更新。在編寫本書時,中繼資料監視還沒有擴充到icloud之外以用于其他的檔案夾。從os x導出的代碼無法像期望的那樣在ios上工作。目前,準确地講,有兩個搜尋域可供ios使用:即普遍存在的資料範圍和普遍存在的文檔範圍(即icloud和icloud)。
直到ios中出現了一般的功能之後,才能使用kqueue。這種老式技術提供了可伸縮的事件通知。利用kqueue,可以監測添加和清除事件。這粗略地等同于尋找要添加和删除的檔案,它們是你想做出反應的主要更新類型。秘訣2-3展示了一個用于監視documents檔案夾的kqueue實作。
2.3.1 支援文檔檔案共享
要支援檔案共享,可以向應用程式的info.plist中添加一個uifilesharingenabled鍵,并把它的值設定為yes,如圖2-2所示。在處理非原始的鍵和值時,這個項目被稱為支援itunes檔案共享的application。itunes将在每個裝置的apps頁籤中列出所有聲明檔案共享支援的應用程式,如圖2-3所示。

在itunes中,将在裝置的apps頁籤中列出每個安裝的聲明了uifilesharingenabled的應用程式
2.3.2 使用者控制
不能指定在documents檔案夾中允許存放哪些類型的項目。使用者可以添加他們喜歡的任何項目,以及删除他們希望删除的任何項目。不過,他們不能做的是使用itunes界面導航子檔案夾。注意圖2-3中的inbox檔案夾,這是一個從應用程式之間的文檔共享中遺留下來的工件,但它不應該出現在那裡。使用者不能直接管理資料,不應該把子檔案夾留在那裡以使他們混淆。
使用者在itunes中不能像删除其他檔案和檔案夾那樣删除inbox,應用程式應該也不能直接把檔案寫到inbox中。尊重inbox的角色,它用于捕獲從其他應用程式傳入的任何資料。在實作檔案共享支援時,總是要檢查inbox以恢複活動狀态,并且處理該資料以清空inbox,以及無論何時應用程式啟動和恢複運作時都要删除它。在本章後面将讨論處理傳入的文檔的最佳實踐。
2.3.3 xcode通路
作為一位開發人員,你不僅能夠通路documents檔案夾,而且能夠通路整個應用程式沙盒。使用xcode organizer (command-2) > devices頁籤>“裝置”> applications >“應用程式名稱”可以浏覽沙盒,以及從中上傳和下載下傳檔案。
通過啟用應用程式的uifilesharingenabled屬性,可以測試基本的檔案共享,以及把資料加載到documents檔案夾中。在建立了那些檔案之後,可以使用xcode和itunes檢查、下載下傳和删除它們。
2.3.4 掃描新文檔
秘訣2-3通過在其begingeneratingdocumentnotificationsinpath:方法中請求kqueue通知來工作。在這裡,它擷取一個用于你所提供的路徑(在這裡是documents檔案夾)的檔案描述符,并請求用于添加和清除事件的通知。它将把這個功能添加到目前的運作循環中,無論何時監測的檔案夾更新,都會啟用通知。
一旦接收到那個回調,它将釋出一條通知(我自定義的kdocumentchanged,在kqueuefired方法中),并且繼承監視新事件。在主線程上的主運作循環中都會運作它,是以一旦接收到通知,gui就可以響應并更新它自身。
下面的代碼段示範了如何使用秘訣2-3的螢幕來更新gui中的檔案清單。無論何時内容改變了,更新通知都允許應用程式重新整理那些目錄内容清單:
把裝置連接配接到itunes,測試這個秘訣。使用itunes app頁籤界面添加和删除項目。裝置的機載檔案清單将會更新,以實時反映那些改變。
在使用這個秘訣時,要知道一些警告。首先,對于較大的文檔,在收到了建立它們的通知之後,不應該立即閱讀它們。你可能希望調查檔案大小,以确定何時應該停止寫入資料。第二,itunes file sharing在必要時可以暫緩傳輸,要相應地進行編碼。
秘訣2-3 使用kqueue檔案監測器