2013-05-30 30 views

回答

2

沒有內置的支持來檢測這個改變,只是爲了檢測用戶是否已經註銷。一種常見的方法是將一個標識文件寫入iCloud,與Core Data分開,然後監視該文件到看它是否消失細節有所不同,但它通常是這樣的:。

  1. 編寫使用文件iCloud調用,並將文件名保存爲用戶默認值。每個使用該帳戶的設備將具有不同的文件,因此在文件名中包含UUID是個不錯的主意。你只寫這個文件,你永遠不會改變它。

  2. 使用NSFilePresenterNSMetadataQuery來獲得該文件的更改通知 - 如果它消失了。

如果文件消失,立即採取措施來卸載整個核心數據堆棧,包括每一個管理對象,因爲他們不具備持久性存儲備份它們了。

一個示例實現在Black Pixel's version of the Core Data "Recipes" demo app。您可能需要對其進行調整才能使其在代碼中正常工作。

+0

雅我已經做了這件事,但我的問題是爲文檔和數據設置爲關閉。任何解決此問題的方法 – Sachin

+0

使用定位文件*是用戶關閉文檔和數據的解決方法。 –

+0

NSMetadataQuery是邪惡的。它需要一個運行循環,並且必須在主線程上完成它的工作。使用sync'd sentinel文件不會用於檢測帳戶更改(或刪除所有按鈕),因爲另一個peer可能會隨意刪除它。該文件需要在.nosync中。 – ImHuntingWabbits

1

有兩種情況:

  1. 的應用程序沒有運行,或者在後臺帳戶狀態發生變化時。

這裏的解決方案是使用NSUserDefaults(或其他本地存儲在應用程序中)存儲/比較身份標記。從NSFileManager獲取身份標記,並在每次應用完成啓動或回到前臺時將其與緩存的值進行比較。

id token = [[NSFileManager defaultManager] ubiquityIdentityToken]; 
  1. 的應用程序正在運行的帳戶更改。

這需要文件主持人來容器內的「東西」。最好的解決方案是使用不是同步的文件。

實現-accommodatePresentedItemDeletionWithCompletionHandler:產生一個線程(dispatch_async工程很好),並進行清理工作。

+0

ubiquityIdentityToken是IOS6功能。我的應用程序支持IOS5,也可用於iOS 5的 – Sachin

+0

,您可以將其降級爲調用 - [NSFileManager URLForUbiquitousContainerIdentifier:],以發現設備上是否有活動帳戶。這可能需要很長時間。 – ImHuntingWabbits

相關問題