Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 域对象更新在写入时失败_Ios_Swift_Firebase_Realm - Fatal编程技术网

Ios 域对象更新在写入时失败

Ios 域对象更新在写入时失败,ios,swift,firebase,realm,Ios,Swift,Firebase,Realm,每当firebase中出现值更改时,我都会尝试更新一个领域对象。它就像每当服务器中的对象发生更改时,它都会自动触发新的写入操作,并使用主键uid更新obejct 这是我几天前发布的一个问题。它给了我一个暂时的解决方案,这个方案暂时有效,但随后出现了以下错误 第一次运行时,一切正常,并更新了对象。但是,当我重新运行程序时,它创建了一个主键为空的重复对象 它使应用程序崩溃,说我正试图覆盖primarykey对象 我甚至出现了错误,它说写事务已经在处理中了 我完全遵循提供的领域文档,但完全是出于运气

每当firebase中出现值更改时,我都会尝试更新一个领域对象。它就像每当服务器中的对象发生更改时,它都会自动触发新的写入操作,并使用主键
uid
更新obejct

这是我几天前发布的一个问题。它给了我一个暂时的解决方案,这个方案暂时有效,但随后出现了以下错误

  • 第一次运行时,一切正常,并更新了对象。但是,当我重新运行程序时,它创建了一个主键为空的重复对象

  • 它使应用程序崩溃,说我正试图覆盖primarykey对象

  • 我甚至出现了错误,它说写事务已经在处理中了

  • 我完全遵循提供的领域文档,但完全是出于运气

    我正在对领域对象进行更新触发器的代码:

            FBDataservice.ds.REF_USERS.child(uuid).observe(.value, with: { (snapshot) in
            if snapshot.hasChild("credentials") {
                if let snap = snapshot.value as? Dictionary<String, Any> {
                    if let cred = snap["credentials"] as? Dictionary<String, Any> {
                        let u = User(userid: uuid, userData: cred)
    //                        try! RealmService.uirealm.realm.write {
                            self.usercache.uid = uuid
                            self.usercache.name = u.name
                            self.usercache.bio = u.aboutme
                            if u.phoneNumer != nil {
                                self.usercache.phone = u.phoneNumer
                            }
                            self.usercache.email = u.email
                            self.usercache.username = u.username
                            if u.userPic != nil {
                                do {
                                    self.usercache.imageL = try Data(contentsOf: URL(fileURLWithPath: u.userPic))
                                }catch {
                                    print("The image doesnt exists")
                                }
                            }
    //                            self.usercache.writeToRealm()
                        try! RealmService.uirealm.realm.write {
                            RealmService.uirealm.realm.create(UserData.self, value: ["uid":uuid], update: true)
                        }
    //                            RealmService.uirealm.realm.add(self.usercache, update: true)
    
    
    
    //                        }
                    }
                }
            }
        })
    

    我真的很难找到正确的解决办法。非常感谢您的帮助。如果需要提供有关此问题的更多信息。请务必让我知道。

    编辑:好的,我现在看到了。可能在create方法中设置update:false。@u84six但这不会停止更新对象中的当前记录。事实上,我还有另一个对象,我用同样的方法设置了它,只调用
    writeToRealm()
    方法,它只更新了它,没有任何复制或错误。我想我对扩展中的create with update和add with update有点困惑。为什么既有create又有add?@u84six如果看得清楚,一个被注释掉了。我两个都试过了。只是他们正在复制记录,创建的记录没有注释掉,扩展插件也没有注释掉
    class UserData : Object {
    
    @objc dynamic var name: String? = nil
    @objc dynamic var bio: String? = nil
    @objc dynamic var email: String? = nil
    @objc dynamic var username: String? = nil
    @objc dynamic var phone: String? = nil
    @objc dynamic var uid : String? = nil
    @objc dynamic var imageL: Data? = nil
    
    override static func primaryKey() -> String {
        return "uid"
    }
    
    }
    
    extension UserData {
    
    
    func writeToRealm(){
        try? RealmService.uirealm.realm.write {
            RealmService.uirealm.realm.add(self, update: true)
        }
    }
    
    func DeleteFromRealm(object: Results<UserData>){
        try? RealmService.uirealm.realm.write {
            RealmService.uirealm.realm.delete(object)
        }
    }
    
    }
    
    class RealmService {
    
    static let uirealm = RealmService()
    
    private var _initRS = try! Realm()
    
    var realm: Realm! {
        return _initRS
    }
    }