国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

A!pp與Extensions間通信共享數據

2019-11-02 14:53:35
字體:
來源:轉載
供稿:網友

   最近玩了玩Watch開發,而目前Watch的主要邏輯處理都是放在WatchKit Extension。真正的Host App,也就是WatchKit App只是用來在界面上顯示數據的。于是實踐了下containing app與app extension之間的通信和數據共享。

  App Groups & Framework

  這兩樣兵器大家都很熟悉。想要共享數據就需要開啟App Groups,給group起一個風騷的名字,這樣無論是NSUserDefaults還是NSFileMana

動態圖片[www.62-6.com]
ger都能通過App Groups共享持久層數據了。Core Data也需要NSFileManager提供存儲的URL支持,而存取Core Data中的數據需要大量的模板代碼,在持久層文件共享之后,代碼也應該做到共享,所以將能夠重用的代碼打包成Framework就顯得尤為重要。(除非是為了做畢設湊代碼量)

  還是以HardChoice為例,我新建了一個類型為Cocoa Touch Framework的target,名字叫DataKit。新建一個DataAccess.swift文件并將以前AppDelegate.swift中自動生成的Core Data模版代碼轉移過來。得益于Swift1.2的改進,構造一個線程安全的單例模式變得無比簡單:

  private static let instance = DataAccess()

  public class var sharedInstance : DataAccess {

  return instance

  }

  需要注意Swift的權限控制問題,我們需要在暴漏給框架使用者的公開接口和屬性前加上public關鍵字修飾。

  為了實現Core Data持久層共享,需要修改原先的applicationDocumentsDirectory屬性:

  lazy var applicationDocumentsDirectory: NSURL = {

  // The directory the application uses to store the Core Data store file. This code uses a directory named "com.yxy.iCloudCoreDataTest" in the application's documents Application Support directory.

  // let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)

  // return urls[urls.count-1] as! NSURL

  var sharedContainerURL:NSURL? = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier(appGroupIdentifier)

  return sharedContainerURL ?? NSURL()

  }()

  在這里containerURLForSecurityApplicationGroupIdentifier方法起到了至關作用。

  同樣能夠共享的代碼就是Model層,它們都是NSManagedObject的子類,用于存儲Core Data中的數據實例。在把它們從原來的位置拖拽過來時別忘了更改下文件的target:”File inspector”->”Target Membership”,選中DataKit。

  在處理iCloud與Core Data同步數據時,我對NSPersistentStoreCoordinatorStoresWillChangeNotification、NSPersistentStoreCoordinatorStoresDidChangeNotification和NSPersistentStoreDidImportUbiquitousContentChangesNotification這三個數據更新的通知進行了觀察和處理,但是寫在了persistentStoreCoordinator計算屬性的get方法中。現在使用lazy關鍵字進行惰性加載,導致對這三個數據更新通知的觀察延后,這會引發嚴重的錯誤。所以需要將那三個addObserverForName(name, object, queue, usingBlock)方法挪到init()方法中,在第一時間觀察通知。

  最后在AppDelegate.swift中添加import DataKit,替換掉中的application(application, didFinishLaunchingWithOptions) -> Bool方法中controller.managedObjectContext = managedObjectContext為controller.managedObjectContext = DataAccess.sharedInstance.managedObjectContext,也就是不再使用以前的模板代碼中的上下文實例,而是用DataAccess單例中的managedObjectContext。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 浦城县| 吉水县| 柘城县| 永川市| 乌海市| 囊谦县| 抚宁县| 邹城市| 灵璧县| 南宫市| 清苑县| 大宁县| 通榆县| 饶河县| 芜湖市| 太原市| 霍州市| 通城县| 上杭县| 岫岩| 临潭县| 西吉县| 石渠县| 东台市| 探索| 巴彦淖尔市| 德安县| 公主岭市| 祁连县| 高清| 河间市| 阜阳市| 五河县| 黄浦区| 健康| 石首市| 航空| 祥云县| 广宗县| 鹤峰县| 绥阳县|