几年前,Apple发布了Core Data应用程序的iCloud同步.然后我使用新的Apple机制发布了一个带有共享模型的iPad/iPhone/MAC应用程序.事情没有像预期的那样发生.同步机制有时不起作用.例如,在我的情况下,最近几个月很少通过我的3台设备完成同步.一般上传对象工作正常.但新的或删除的对象的下载过程正常崩溃.Apple前段时间发布了一种方法来强制设备重新下载模型的所有对象(NSPersistentStoreRebuildFromUbiquitousContentOption),这些对象正常工作,但这不是一个可接受的解决方案.
我的问题:是否有人完成了让iCloud + Core Data正常工作?如何在iOS 9 + El capitan下运行iCloud + CD,有什么经验吗?
我正在评估迁移到新的CloudKIT API,但我不喜欢在设备离线时自我管理对象上传的想法.指示模型更改的推送通知的新机制是否正常工作?
谢谢
我有一个已经使用Core Data的项目.我已经添加了对iPad的支持,但现在需要使用iCloud和Core Data来同步数据.
我遇到了Ensembles,它似乎是一个简单而强大的框架,可以添加到我的项目中.在这里找到:https://github.com/drewmccormack/ensembles
但是,Ensembles项目中没有Swift示例项目,所以我自己试图这样做.以下是我采取的步骤,
步骤1
手动将Ensembles添加到iOS项目中.
第2步
使用现有的持久存储.sql文件创建新的CoreDataStack.
import UIKit
import CoreData
class CoreDataStack: NSObject, CDEPersistentStoreEnsembleDelegate {
    static let defaultStack = CoreDataStack()
    var ensemble : CDEPersistentStoreEnsemble? = nil
    var cloudFileSystem : CDEICloudFileSystem? = nil
    // MARK: - Core Data stack
    lazy var storeName : String = {
        return NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleNameKey as String) as! String
    }()
    lazy var sqlName : String = {
        return "SingleViewCoreData.sqlite"
    }()
    lazy var icloudStoreName : String = {
        return self.storeName + "CloudStore"
    }() …Run Code Online (Sandbox Code Playgroud) 我正在使用Ensembles框架与iCloud同步数据.一切正常,直到我迁移到Swift 3.
该框架在Objective-C中,我的appDelegate功能已迁移到Swift 3; 从那以后我就遇到了问题.appDelegate.syncWithCompletion保存更改时,我会调用整个应用程序NSManagedObjects.
这是appDelegate功能
// MARK: Ensembles
var cloudFileSystem: CDECloudFileSystem!
var ensemble: CDEPersistentStoreEnsemble!
func syncWithCompletion(completion:@escaping (_ completed:Bool) -> Void) {
    if !ensemble.isLeeched {
        ensemble.leechPersistentStore { error in
            if error != nil {
                print("cannot leech \(error!.localizedDescription)")
                completion(false)
            }
            else {
                print("leached!!")
                completion(true)
            }
        }
    }
    else {
        ensemble.merge{ error in
            if error != nil {
                print("cannot merge \(error!.localizedDescription)")
                completion(false)
            }
            else {
                print("merged!!")
                completion(true)
                //NSNotificationCenter.defaultCenter().postNotificationName("Updated-DB", object: nil)
            }
        }
    }
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的Core Data应用程序中实现iCloud同步.我不是那么专业的编程,这真的是我学到的一个高级主题......我发现Drew McCormack的核心数据同步框架"Ensembles".它似乎使iCloud Sync更容易.
我将它集成到我的应用程序中,只要我将新对象添加到我的Core Data模型中,同步就能很好地工作.但是当我删除一个对象时,它会创建重复项.然后从重复复制.我最终拥有3-4次相同的条目(对象)......
这是为什么?我究竟做错了什么?我做了一些研究,我的猜测是全局标识符可以解决这个问题吗?
什么是全局标识符?我猜他们有助于避免重复!?但是我该怎么设置呢?我真的不知道,做了很多研究但却找不到答案.
感谢帮助!
更新: 感谢您的帮助!我读了自述书和书,但因为我是初学者,所以一切都不清楚.
我想我现在理解在Ensembles中使用全局标识符,但我不知道我是否正确地使用它.
如果我理解正确,我必须为每个对象分配一个标识符.我可以通过将其存储在属性中来实现.只要它是唯一的NSString,这个标识符可以是任何东西吗?
在我的应用程序中,用户可以存储不同的东西,假设名称,文本,标题,日期等.该应用程序基于Xcode中的Master-Detail-View模板,并使用Core Data.我的核心数据模型只有一个具有一些属性的实体,大多数是字符串和NSDate.没有关系或任何东西.如果用户点击"+",则创建一个新对象,并将用户输入的内容存储在属性中.
我添加全局标识符的做法是添加一个存储它的新属性.所以当我创建一个新对象时
/// I did find that to use as identifier !?
NSString *taskUniqueStringKey = newManagedObject.objectID.URIRepresentation.absoluteString;
/// and store it in the attribute.
[newManagedObject setValue:taskUniqueStringKey forKey:@"coreDataObjectID"]; 
Run Code Online (Sandbox Code Playgroud)
然后我用这个:
- (NSArray *)persistentStoreEnsemble:(CDEPersistentStoreEnsemble *)ensemble globalIdentifiersForManagedObjects:(NSArray *)objects
{
return [objects valueForKeyPath:@"coreDataObjectID"];;
}
Run Code Online (Sandbox Code Playgroud)
这似乎对我有用.但我做得对吗?这是分配全局标识符的正确位置吗?我没有awakeFromInsert!
如果这个工作,我得到了下一个问题.我的应用已经存在,用户在更新之前保存的旧条目将缺少全局标识符.我该怎么办?我认为我已经得到了什么以及什么是唯一的,我唯一能想到的是在创建对象时保存[NSDate date]的属性.
我试图使用它,但我失败了因为Ensembles只会接受NSString而不是NSDate!?我可以使用这个日期属性,这是否足够独特并且可以作为gloabl标识符使用?如果是的话,请你给我一些如何将这个从日期转换为字符串的代码示例?
与Ensembles同步非常有效.没有重复,您可以关闭iCloud并保留条目并再次打开它,它会像它应该同步而不会丢失本地存储的对象左右.合奏真的很酷!我看到一些小的奇怪的行为,有时同步需要很长时间,有时它真的很快,如果我在两个不同的设备上在短时间内编辑的东西,它有点混乱像我刚刚删除的对象重新出现.但我觉得这很正常吗?如果我在不同的设备上使用应用程序之间花一些时间一切正常.
我理解正确,只有一种方法可以调用同步:
- (void)syncWithCompletion:(void(^)(void))completion
{
if (self.ensemble.isMerging) return;
if (!self.ensemble.isLeeched) {
    [self.ensemble leechPersistentStoreWithCompletion:^(NSError *error) {
        if (error) NSLog(@"Error in leech: %@", error);
        if (completion) …Run Code Online (Sandbox Code Playgroud) 我想使用来自github的Drew McCormack的Ensembles来缓解我目前的iOS/swift/coredata/iCloud引发的头痛.所有Ensembles示例都在Objective-C中.我在项目中将它作为一个框架,但作为一个周末编码器,我无法推断如何从ObjC示例代码中使用它.
有没有人看过使用swift的合奏方法?
添加:我有它作为一个框架,但我如何设置它并让它开始Leching?Obj-C的方式是
//SetupEnsemble
cloudFileSystem=[[CDEICloudFileSystemalloc] initWithUbiquityContainerIdentifier:@"container"];
ensemble=[[CDEPersistentStoreEnsemblealloc]initWithEnsembleIdentifier:@"MainStore" persistentStoreURL:storeURL
        managedObjectModelURL:modelURL
cloudFileSystem:cloudFileSystem]; ensemble.delegate=self;
Run Code Online (Sandbox Code Playgroud)
然后是利奇
if(!ensemble.isLeeched){
[ensemble leechPersistentStoreWithCompletion:^(NSError *error) {
if (error) NSLog(@"Could not leech to ensemble: %@", error); }];}
Run Code Online (Sandbox Code Playgroud) ensembles ×5
core-data ×4
icloud ×3
ios ×3
swift ×3
cloudkit ×1
duplicates ×1
identifier ×1
objective-c ×1