Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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
Swift 领域默认同步文件_Swift_Realm_Realm Mobile Platform - Fatal编程技术网

Swift 领域默认同步文件

Swift 领域默认同步文件,swift,realm,realm-mobile-platform,Swift,Realm,Realm Mobile Platform,学习如何使用Realm移动平台。 我构建了一个小的iOS应用程序,它成功地将数据保存到服务器,并且数据在不同的设备上保持一致。该应用程序非常类似于 我可以从Realm Browser Mac应用程序中打开同步URL,并且我可以实时看到发生的更改。这就是我被卡住的地方:我试图查看本地领域文件中的更改,但是 print(self.realm.configuration.fileURL)返回nil print(Realm.Configuration.defaultConfiguration.fileU

学习如何使用Realm移动平台。

我构建了一个小的iOS应用程序,它成功地将数据保存到服务器,并且数据在不同的设备上保持一致。该应用程序非常类似于

我可以从Realm Browser Mac应用程序中打开同步URL,并且我可以实时看到发生的更改。这就是我被卡住的地方:我试图查看本地领域文件中的更改,但是

print(self.realm.configuration.fileURL)
返回nil
print(Realm.Configuration.defaultConfiguration.fileURL)
是一个空文件

这是我的代码:

SyncUser.logIn(with: cloudKitCredentials, server: serverURL) { user, error in
    guard let user = user else {
        fatalError(String(describing: error))
    }

    DispatchQueue.main.async {
        // Open Realm
        let configuration = Realm.Configuration(
            syncConfiguration: SyncConfiguration(
                user: user,
                realmURL: URL(string: "realm://myIPaddress/~/realmtasks")!)
            )

        self.realm = try! Realm(configuration: configuration)

        // Show initial tasks
        func updateList() {
            self.items = Array(self.realm.objects(Row.self))
            self.tableView.reloadData()
        }

        updateList()

        print(self.realm.configuration.fileURL) 
        //returns nil

        print(Realm.Configuration.defaultConfiguration.fileURL) 
        // I can open the file, but it's empty

        // Notify us when Realm changes
        self.notificationToken = self.realm.addNotificationBlock { _ in
            updateList()
        }
}

我测试这个的原因是,我可以从文件而不是服务器加载数据。因此:(a)只有在(b)当用户离线时数据可用时,才会调用登录

当您首次登录时,域自动将用户存储在密钥链中。然后,您可以通过
SyncUser.currentUser
属性检索它,并使用它打开您的领域,即使您处于脱机状态。但是,如果您注销该用户,则无法脱机使用它

使用
syncConfiguration
时,
realm.configuration.fileURL
不可用


在这种情况下:

  • 调用
    SyncUser.logIn
    仅一次
  • 对于正常的应用程序运行(即除初始运行外的所有运行),请打开具有相同配置的领域
  • 你应该有这样的东西:

    // First launch
    if launchedBefore == false {
        setupRealm()
    
    // All other launches
    } else if launchedBefore == true {
        let user = SyncUser.current!
        openRealm(forUser: user)
    }
    
    openRealm(forUser:SyncUser)
    与前面代码中的整个调度块基本相同

    setupRealm()
    也可以调用它来清理代码:

    SyncUser.logIn(with: cloudKitCredentials, server: serverURL) { user, error in
        guard let user = user else {
            fatalError(String(describing: error))
        }
    
        self.openRealm(forUser: user)
    }
    

    你能提供坠机的详细情况吗?例如,如何复制它等?显然,设备脱机时无法进行同步,但是,您仍然可以访问脱机前同步的数据。进行初始用户身份验证时,应用程序需要在线。@teotwaki我似乎没有正确地表达我的问题。对不起。换言之:我的印象是,使用ROS将创建镜像的磁盘域文件。在进一步实验之后,我创建了一个领域文件,它将驻留在设备上,然后每当发生更改时,将更改推送到服务器上的另一个领域文件。服务器上的域用于备份,而磁盘上的文件是主要的脱机文件。我不确定这是否是好的/坏的做法,但我会在实验完成后发布我的实验以获得反馈。非常感谢您的回复。这里没有“服务器上的领域”的概念。您总是处理本地文件,即使是查询/修改。如果文件已启用同步,则其历史记录将在服务器上复制,从而允许其他客户端下载历史记录并在本地重新组装域。实际上,您正在做与ROS手动提供的相同的事情。好的!中止我的实验。如果您使用
    syncURL
    打开域,则会出现这种情况。很抱歉,我没有完全理解。当前,
    default.realm
    为空。在我使用
    SyncUser.currentUser
    后,它是否会自动填充?在这种情况下,正确的打开方式是什么?@Jalal您正在为要打开的领域指定一个URI,因此文件名将不同于
    default.Realm
    default.realm
    仅在使用默认构造函数时使用(即:
    let realm=realm()
    )。请注意,打开同步域时,本地文件的位置对您隐藏。您不应该试图手动访问它。@teotwaki哇,谢谢!您的评论帮助我了解了我的测试方法是如何错误的。