精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

CoreData遇見iCloud的那些坑

移動開發(fā) iOS
盡管蘋果把iCloud與CoreData之間的完美配合吹的天花亂墜,但在iOS7之前,想用iCloud同步CoreData數(shù)據(jù)簡直就是噩夢,蘋果自己也承認了之前的諸多bug和不穩(wěn)定性,這讓蘋果不得不重新站出來說他們的工程師已經(jīng)在iOS7中修復了bug,增強了體驗,balabala,關鍵是對于程序員來說,將iCloud集成到CoreData變得無比簡單。

盡管蘋果把iCloud與CoreData之間的***配合吹的天花亂墜,但在iOS7之前,想用iCloud同步CoreData數(shù)據(jù)簡直就是噩夢,蘋果自己也承認了之前的諸多bug和不穩(wěn)定性,這讓蘋果不得不重新站出來說他們的工程師已經(jīng)在iOS7中修復了bug,增強了體驗,balabala,關鍵是對于程序員來說,將iCloud集成到CoreData變得無比簡單。

在蘋果的官方文檔中已經(jīng)把配置工作敘述的很明確了,簡單地說可以總結為三步:

在iTunes Connect創(chuàng)建App ID,在Xcode中找到項目的Capabilities標簽并開啟iCloud選項。這會為你創(chuàng)建一個默認的iCloud容器,名字格式為“com.XXX.yourAppID”

添加NSPersistentStore時向options參數(shù)傳入一個持久存儲的名稱,自己起一個就行,示例代碼如下:

  1. NSDictionary *storeOptions = 
  2.     @{NSPersistentStoreUbiquitousContentNameKey: @"MyAppCloudStore"}; 
  3. NSPersistentStore *store = [coordinator addPersistentStoreWithType:NSSQLiteStoreType 
  4.                                                      configuration:nil 
  5.                                                                URL:storeURL 
  6.                                                            options:storeOptions 
  7.                                                              error:&error]; 

對NSPersistentStoreCoordinatorStoresWillChangeNotification,NSPersistentStoreCoordinatorStoresDidChangeNotification和NSPersistentStoreDidImportUbiquitousContentChangesNotification這三個通知進行注冊以便接收通知后對數(shù)據(jù)進行處理。***用NSNotificationCenter的addObserverForName:object:queue:usingBlock:方法來使邏輯更加明確,代碼更緊湊。

***貼上Swift實現(xiàn)persistentStoreCoordinator的代碼:

  1. var persistentStoreCoordinator: NSPersistentStoreCoordinator! { 
  2.    if _persistentStoreCoordinator == nil { 
  3.        let storeURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("HardChoice.sqlite"
  4.        var error: NSError? = nil 
  5.        _persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) 
  6.          
  7.        // iCloud notification subscriptions 
  8.        let dc = NSNotificationCenter.defaultCenter() 
  9.        dc.addObserverForName(NSPersistentStoreCoordinatorStoresWillChangeNotification, object: self.persistentStoreCoordinator, queue: NSOperationQueue.mainQueue(), usingBlock: { (note) -> Void in 
  10.            self.managedObjectContext.performBlock({ () -> Void in 
  11.                var error: NSError? = nil 
  12.                if self.managedObjectContext.hasChanges { 
  13.                    if !self.managedObjectContext.save(&error) { 
  14.                        println(error?.description) 
  15.                    } 
  16.                } 
  17.                self.managedObjectContext.reset() 
  18.            }) 
  19.        }) 
  20.        dc.addObserverForName(NSPersistentStoreCoordinatorStoresDidChangeNotification, object: self.persistentStoreCoordinator, queue: NSOperationQueue.mainQueue(), usingBlock: { (note) -> Void in 
  21.            self.managedObjectContext.performBlock({ () -> Void in 
  22.                var error: NSError? = nil 
  23.                if self.managedObjectContext.hasChanges { 
  24.                    if !self.managedObjectContext.save(&error) { 
  25.                        println(error?.description) 
  26.                    } 
  27.                } 
  28.            }) 
  29.        }) 
  30.        dc.addObserverForName(NSPersistentStoreDidImportUbiquitousContentChangesNotification, object: self.persistentStoreCoordinator, queue: NSOperationQueue.mainQueue(), usingBlock: { (note) -> Void in 
  31.            self.managedObjectContext.performBlock({ () -> Void in 
  32.                self.managedObjectContext.mergeChangesFromContextDidSaveNotification(note) 
  33.            }) 
  34.        }) 
  35.          
  36.        if _persistentStoreCoordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: [NSPersistentStoreUbiquitousContentNameKey:"MyAppCloudStore"], error: &error) == nil { 
  37.            println("Unresolved error \(error), \(error?.userInfo)"
  38.            abort() 
  39.        } 
  40.    } 
  41.    return _persistentStoreCoordinator! 
  42. var _persistentStoreCoordinator: NSPersistentStoreCoordinator? = nil 

當然你也可以用lazy關鍵字同樣來實現(xiàn)persistentStoreCoordinator屬性的惰性加載。

已經(jīng)有人將整套CoreData集成iCloud的邏輯抽象出來,比如iCloudCoreDataStack。完全不需要再用宣稱能讓CoreData與iCloud搭配更簡單的第三方庫了,因為在iOS7中蘋果的確讓它簡單至極了。

然而當Xcode6和iOS8襲來,一個個坑爭先恐后的出現(xiàn)了。

首先是iCloud Drive,它與之前iCloud有沖突。如升級,請徹底,讓測試機器都升級iCloud Drive。

然后是Xcode6中開啟Capabilities標簽的iCloud選項卡后,如下的場景簡直是臥槽:

 

該怎么選怎么選啊?!我只能說按照上圖這么選就對了。順便說一下iCloud默認容器名稱格式已經(jīng)變成了“iCloud.com.yourname.yourAppID”,其實這也不太準確,官方稱作“iCloud.$(CFBundleIdentifier)”,后面的美元號所指的變量就是General中Identity一欄的“Bundle Identifier”值。此外“Key-value storage”和“CloudKit”選項選不選都可以,但“iCloud Documents”一定要勾選,否則是無法同步CoreData數(shù)據(jù)的。

PS:CloudKit是蘋果***推出的基于iCloud的一個云端數(shù)據(jù)存儲服務,提供了低成本的云存儲并能作為一個后端服務通過用戶們的iCloud賬號分享其應用數(shù)據(jù)。

接下來是時候檢查我們是否成功添加了iCloud容器,可以在applicationDidFinishLaunchingWithOptions方法中嘗試獲取容器的URL來判斷:

  1. let containerURL = NSFileManager.defaultManager().URLForUbiquityContainerIdentifier("iCloud.com.yulingtianxia.HardChoice"
  2. if containerURL != nil { 
  3.   println("success:\(containerURL)"
  4. else
  5.   println("URL=nil"

如果之前沒有在Capabilities標簽的iCloud中勾選“iCloud Documents”,“URLForUbiquityContainerIdentifier”方法會始終返回nil。來看看蘋果開發(fā)者論壇上關于這個話題的討論吧

PS:官方文檔不建議在主線程使用URLForUbiquityContainerIdentifier方法,因為它可能需要較長時間來返回URL而阻塞主線程。這里只是為了測試使用。

然而判斷iCloud是否真的與CoreData工作正常,蘋果的官方文檔寫的很詳細:Using the iCloud Debugging Tools

當我興致沖沖的打開Xcode中的debug navigator,點擊左邊的iCloud查看狀態(tài)時,被眼前的一切驚呆了:

 

“iCloud Usage”告訴我狀態(tài)不可用,然而右下角的日志中Using local storage已經(jīng)從1變成了0,也就是證明了我的APP(HardChoice)已經(jīng)從CoreData使用本地持久倉庫轉移到了使用“iCloud-enabled”持久倉庫。“Transfer Activity”中柱狀圖更是顯示從iCloud下載了數(shù)據(jù)。而這其實應該是Xcode6的一個bug,有人已經(jīng)在蘋果開發(fā)者論壇討論了。

根據(jù)我的測試,只勾選“Key-value storage”或者在模擬器上調試時,“iCloud Usage”都不會出現(xiàn)。而即使“iCloud Usage”出現(xiàn)了,狀態(tài)也始終是Disabled,“Transfer Activity”也不是很靈敏。唯獨只能相信CoreData的log了。

但我們可以查看“My Mac”的“iCloud Usage”而不是iPhone的“iCloud Usage”:

 

在“Documents”一欄中可以看出我在兩個設備間同步了數(shù)據(jù),“mobile”后面跟著的是我的設備編號。展開數(shù)據(jù)可以看到更詳細的同步記錄:

雖然通過“My Mac”可以看到iCloud與CoreData的數(shù)據(jù)同步記錄,但是在Xcode6.1.1中“Documents”的顯示不是很正常,在***的Xcode6.2beta版中雖然修復了“Documents”的顯示問題,但“iCloud Usage”的種種bug依然存在。

***,確保網(wǎng)絡通常。我在中軟實訓一個月時,網(wǎng)絡奇差,或是屏蔽了iCloud,一直沒能調試成功。

貼一張HardChoice同步成功的測試圖,因為我是用Swift寫的這個Demo,所以喜歡用Swift的可以直接把我的那部分源碼粘過去用:

 

責任編輯:chenqingxiang 來源: 玉令天下的博客
相關推薦

2020-04-21 15:18:11

財務信息化

2022-05-15 08:13:50

Mysql數(shù)據(jù)庫Mycat

2017-07-19 14:26:01

前端JavaScriptDOM

2021-09-07 14:35:48

DevSecOps開源項目

2013-04-12 15:59:33

2017-07-06 11:41:48

CIOIT技術

2017-03-31 10:27:08

推送服務移動

2020-05-28 16:15:50

HTTP暗坑前端

2020-03-12 15:00:44

JavaSpring依賴

2011-12-22 19:57:38

PhoneGap

2018-02-06 08:36:02

簡歷程序員面試

2017-08-28 15:30:49

Android編碼器編碼

2015-04-13 17:39:11

移動IM開發(fā)

2011-12-15 09:45:21

PhoneGap

2017-08-04 17:07:32

JavaArraysList

2016-12-28 13:19:08

Android開發(fā)坑和小技巧

2018-07-05 06:02:38

綜合布線弱電動力線

2015-07-27 09:25:45

core data

2018-03-30 09:21:30

程序員網(wǎng)絡招聘

2015-08-10 14:11:48

亞馬遜AWS中國Amazon S3
點贊
收藏

51CTO技術棧公眾號

国产美女精彩久久| 精品国产一区二区三区性色av| 亚洲a在线视频| 精品少妇一区二区三区| 国产淫片免费看| 婷婷在线视频| 亚洲精品视频一二三区| 亚洲图片一区二区| 图片区小说区区亚洲五月| 国产免费av电影| 亚洲综合好骚| 欧美不卡视频一区发布| 亚洲精品国产熟女久久久| 久久伊人精品| 在线免费亚洲电影| 久久国产午夜精品理论片最新版本| 九色视频网站在线观看| 国产成人在线观看| 精品国产美女在线| 国产精品久久无码| 国产免费区一区二区三视频免费 | 国产黄色片在线| 黄色欧美在线| 免费在线黄色电影| 日韩精品一级二级| 国内外成人免费激情在线视频| 一级在线观看视频| 欧美韩一区二区| 日韩一区二区在线播放| 亚洲欧美日韩一级| 韩国久久久久久| 午夜电影久久久| 青青草视频国产| 黄网站在线免费| 国产精品传媒入口麻豆| 日韩亚洲欧美精品| 久草视频视频在线播放| 91啪亚洲精品| 精品免费二区三区三区高中清不卡| 国产99999| 极品少妇一区二区三区精品视频| 国产精品va在线播放| 九九精品免费视频| 国产视频一区三区| 97视频在线观看网址| www.99re7.com| 亚洲视频一二| 丰满放荡岳乱妇91ww| 亚洲资源中文字幕| 一级日韩一区在线观看| a天堂中文在线88| 国产欧美日韩激情| 日韩中文字幕av在线| 国产精品一区在线看| 久久精品夜色噜噜亚洲aⅴ| 九色91国产| 色久视频在线播放| 久久女同性恋中文字幕| 欧美一区二区高清在线观看| 国产在线高清| 欧美激情在线一区二区| 亚洲日本欧美在线| 国产在线高潮| 一区二区三区色| 在线视频一区观看| 最新av在线播放| 亚洲国产aⅴ天堂久久| av日韩一区二区三区| 涩涩视频在线免费看| 色av综合在线| 久久久久久久久久一区二区| 国产一区二区视频在线看| 日韩精品一区二区在线观看| 亚洲色偷偷色噜噜狠狠99网| 欧美自拍一区| 成人激情小说网站| 亚洲欧洲激情在线| 青青青手机在线视频| 亚洲精品国产成人影院| 久久久久日韩精品久久久男男| 91国产丝袜播放在线| 日韩av一区二区三区| 成人在线中文字幕| 手机看片福利永久| 国产色综合一区| 黄色一级片网址| 久草免费在线视频| 欧美日韩一级视频| 涩视频在线观看| 精品高清久久| 国内精品免费午夜毛片| 在线观看免费中文字幕| 国产高清不卡二三区| 欧美日本亚洲| 亚洲精品一线| 91亚洲精品久久久蜜桃| 日韩精品久久久免费观看| www.在线视频| 中文字幕欧美激情一区| 操bbb操bbb| 在线视频超级| 欧美一区二区三区四区高清| 亚洲欧美色图视频| 2023国产精品久久久精品双| 国产91精品黑色丝袜高跟鞋| 国产精品视频a| 久久亚洲精精品中文字幕早川悠里| 亚洲看片网站| 手机在线理论片| 欧美一级二级在线观看| 亚洲精品国产91| 日韩视频中文| 成人自拍偷拍| 精品视频在线一区二区| 91国在线观看| 欧美 日本 国产| 国内精品美女在线观看| 国产日韩欧美在线| 九色在线播放| 欧美日韩精品国产| 国产精品日日摸夜夜爽| 91精品啪在线观看国产18| 国产成人精品视频在线| 日韩中文字幕观看| 亚洲精品老司机| 可以看污的网站| 久久国产综合| 国产精品第三页| 日本人妖在线| 欧美日韩国产精品一区二区三区四区 | 在线播放日韩欧美| 探花视频在线观看| av一区二区久久| 人妻av无码专区| 欧美经典一区| 九九精品视频在线观看| 国产精品一区二区人人爽| 国产精品伦一区| 孩娇小videos精品| 日韩国产在线| 国产欧美一区二区三区四区| 国产精品秘入口| 在线观看网站黄不卡| 日韩av在线看免费观看| 免费日韩视频| 五码日韩精品一区二区三区视频| 欧美成人黑人| 亚洲视频在线看| 亚洲精品毛片一区二区三区| 国产亚洲精品超碰| 天堂av在线网站| 91一区在线| 92看片淫黄大片看国产片| 操你啦在线视频| 日韩欧美国产不卡| 久久精品视频日本| av中文字幕一区| 乱子伦视频在线看| 成人在线电影在线观看视频| 国产精品亚发布| 国产激情在线视频| 精品人在线二区三区| 日本一区二区三区四区五区 | 久久久久网址| 日韩高清成人| 伦理中文字幕亚洲| 蜜臀av午夜精品| 色88888久久久久久影院野外| 亚洲综合欧美综合| 国产一区二区三区久久悠悠色av| 欧美 亚洲 视频| 国产精品毛片久久久| 奇米四色中文综合久久| 在线观看精品一区二区三区| 欧美一卡二卡三卡| 日韩少妇高潮抽搐| 中文字幕的久久| 无码人妻aⅴ一区二区三区玉蒲团| 日韩视频一区| 99精品视频网站| 久久精品亚洲成在人线av网址| 日韩av电影手机在线| 国产激情小视频在线| 亚洲成人中文字幕| 丰满人妻一区二区三区四区| 亚洲综合在线免费观看| 国产男男chinese网站| 美女网站一区二区| 日韩精品久久一区二区| 国产99精品一区| 成人资源视频网站免费| 台湾成人免费视频| 久久久久久有精品国产| 成人高清免费观看mv| 欧美mv日韩mv国产网站| 少妇又紧又色又爽又刺激视频| 亚洲制服丝袜在线| 18精品爽国产三级网站| av一区二区三区在线| 三区视频在线观看| 久久久久一区| a级黄色小视频| 999国产精品| 欧美成ee人免费视频| 999在线精品| 国产日韩精品一区二区| 欧美裸体视频| 欧美激情xxxx性bbbb| av在线收看| 精品一区二区电影| aaaa一级片| 欧美日韩精品高清| 国产91精品一区| 性欧美大战久久久久久久久| 中文字幕av播放| 国产精品毛片久久久久久| 星空大象在线观看免费播放| 国产91丝袜在线观看| 亚洲精品成人在线播放| 日日夜夜精品视频免费| 欧美 日韩 亚洲 一区| 自拍偷拍欧美| 精品日韩在线播放| 国产精品成久久久久| 日韩精品极品视频在线观看免费| 亚洲国产精品嫩草影院久久av| 91文字幕巨乱亚洲香蕉| 亚洲欧洲二区| 国产在线观看精品| 国产香蕉久久| 国产精品久久久久久一区二区| 日韩av中字| 欧洲美女7788成人免费视频| 麻豆蜜桃在线观看| 18性欧美xxxⅹ性满足| caoporn视频在线| 久久久久久久国产| 国产丝袜在线播放| 国模精品系列视频| av漫画网站在线观看| 久久久久久亚洲精品| brazzers在线观看| 97视频在线播放| 深夜在线视频| 日韩女优人人人人射在线视频| 最近在线中文字幕| 国产精品第二页| 欧美91在线|欧美| 国产美女91呻吟求| 国产精品亚洲四区在线观看| 91欧美激情另类亚洲| 国产乱码精品一区二区三区亚洲人 | 国产精品嫩草99a| 国精产品久拍自产在线网站| 亚洲欧洲性图库| 国产少妇在线观看| 一区二区三区国产豹纹内裤在线| 毛片a片免费观看| 午夜精品福利一区二区蜜股av| 日产欧产va高清| 日韩欧美一区视频| 做爰视频毛片视频| 欧美一区二区三区免费观看视频| 超碰在线人人干| 亚洲国产精品人人爽夜夜爽| 加勒比一区二区三区在线| 在线观看日韩av| 日本孕妇大胆孕交无码| 午夜欧美大片免费观看| 国产私拍福利精品视频二区| 91精品视频免费看| 国产精品115| 日韩免费av一区二区三区| 欧美岛国激情| 青青草综合在线| 鲁大师影院一区二区三区| 色播五月综合网| 成人永久免费视频| 老熟妇一区二区| 亚洲免费观看在线观看| 亚洲免费黄色网址| 欧美精品黑人性xxxx| 日本xxxx人| 色偷偷偷综合中文字幕;dd| 中文字幕有码在线观看| 欧洲精品在线视频| 美女国产精品久久久| 玖玖玖精品中文字幕| 久久久久久久久99精品大| 国产精品无码人妻一区二区在线| 日本中文字幕一区二区有限公司| 日本人dh亚洲人ⅹxx| 国产亚洲欧美一区在线观看| 精品97人妻无码中文永久在线| 色综合激情久久| 亚洲av无码乱码国产精品久久| 亚洲午夜精品久久久久久性色 | 在线精品视频小说1| 精品久久久中文字幕人妻| 亚洲天堂一区二区三区| 欧美人与动牲性行为| 国产欧美日韩丝袜精品一区| 日韩伦理一区二区三区| 少妇高潮大叫好爽喷水| 日韩二区三区四区| 国产二级一片内射视频播放| 亚洲欧美综合在线精品| aaa人片在线| 欧美成人性福生活免费看| 69xxxx欧美| 日本成人精品在线| 北条麻妃在线一区二区免费播放 | 韩国精品一区二区三区| 久久久久久蜜桃一区二区| 久久在线免费观看| 精品无码黑人又粗又大又长| 在线电影院国产精品| 成人全视频高清免费观看| 欧美一级电影久久| 久久久久久毛片免费看 | 国产精品欧美日韩一区二区| 国产成人久久精品77777综合| 亚洲欧美日韩天堂| 黄色aa久久| www.久久久| 欧美影院一区| 国产精品嫩草影视| 国产精品成人免费在线| 中文字幕二区三区| 中文字幕日韩高清| 色8久久影院午夜场| 免费影院在线观看一区| 一本色道精品久久一区二区三区| 性猛交╳xxx乱大交| 亚洲男同性视频| 国产精品毛片一区视频播 | 国内精品卡一卡二卡三| 高跟丝袜欧美一区| 午夜视频免费看| 97视频在线看| 日韩一级电影| 免费欧美一级视频| 久久午夜羞羞影院免费观看| 日韩三级免费看| 日韩精品极品在线观看| av天堂一区二区| 亚洲精品欧美激情| 国产jzjzjz丝袜老师水多| 欧美精品一二区| 97se亚洲| 久艹视频在线免费观看| 91蜜桃免费观看视频| 亚洲精品中文字幕乱码三区91| 日韩精品极品在线观看播放免费视频| 国产理论在线| 蜜桃视频在线观看成人| 视频一区免费在线观看| 狂野欧美性猛交| 7777精品伊人久久久大香线蕉| 国内精品久久久久国产| av免费观看久久| 一区二区三区四区五区在线| 国产特级黄色录像| 欧美日韩视频在线观看一区二区三区 | 亚洲精品水蜜桃| 成人久久久精品国产乱码一区二区| 韩国一区二区电影| 国产午夜一区| 中文字幕国产高清| 亚洲一区二区美女| 可以免费看污视频的网站在线| 国产精品午夜视频| 欧美影院一区| 免费a级黄色片| 欧美日韩精品一区二区三区蜜桃| 国产欧美久久久久久久久| 国产欧美亚洲日本| 日韩国产精品91| 538任你躁在线精品视频网站| 亚洲国产精品va在线看黑人| 日韩欧美少妇| 97碰在线视频| 国产日韩高清在线| 精品人妻一区二区三区四区不卡 | 国产亚洲精品bt天堂精选| 国产精品欧美激情在线| 97视频在线观看免费高清完整版在线观看| 精品高清在线| 久久久男人的天堂| 欧洲国产伦久久久久久久| 在线观看中文字幕的网站| 免费看污久久久| 国产伦精一区二区三区| 国产伦精品一区二区三区视频网站 | 久久久久国产精品区片区无码| 欧美日韩一区二区三区四区| 欧美人与牲禽动交com| 亚洲一区二区在线看| 99久久精品国产麻豆演员表| 国产同性人妖ts口直男|