领域同步进度(iOS/Swift)

领域同步进度(iOS/Swift),ios,realm,realm-mobile-platform,Ios,Realm,Realm Mobile Platform,我已经用realm local和sync设置了我的应用程序,看起来一切都很好。我最近为多个远程领域实现了同步进度。这也很有效 然而,在更改了一些特定于不同步进度的代码之后,奇怪的事情发生了。对于一个50MB的数据库,我以前会收到5-6个通知,现在我只会收到第一个通知,并且在同步完成时收到 我返回到旧代码,相同的db,它收到多个通知 在过去的几天里,我一直在努力解决这个问题,但运气不佳。你知道为什么会这样吗 在名为BusinessManager的单例中,我保留如下引用: class Busines

我已经用realm local和sync设置了我的应用程序,看起来一切都很好。我最近为多个远程领域实现了同步进度。这也很有效

然而,在更改了一些特定于不同步进度的代码之后,奇怪的事情发生了。对于一个50MB的数据库,我以前会收到5-6个通知,现在我只会收到第一个通知,并且在同步完成时收到

我返回到旧代码,相同的db,它收到多个通知

在过去的几天里,我一直在努力解决这个问题,但运气不佳。你知道为什么会这样吗

在名为
BusinessManager
的单例中,我保留如下引用:

class BusinessManager {
    static let shared = BusinessManager()

    struct SyncNotificationToken {
        let business: Business
        let downloadToken: SyncSession.ProgressNotificationToken
        let uploadToken: SyncSession.ProgressNotificationToken
    }

    private var syncTokens: [String:SyncNotificationToken] = [:]
}
在域的每次更改中更新同步进度引用:

private func configureRemoteBusinessesNotification() {
    guard let remoteBusinesses = remoteBusinesses else { DLog("ERROR obtaining remote businesses"); assert(false); return }

    remoteBusinessesNotificationToken?.stop()

    remoteBusinessesNotificationToken = remoteBusinesses.addNotificationBlock { changes in
        switch changes {
        case .initial:
            self.delegate?.loadedRemoteBusinesses()
            self.updateBusinessProgresses()

        case .update(let results, let deletions, let insertions, let modifications):
            self.delegate?.remoteNotificationUpdate(results: results, deletions: deletions, insertions: insertions, modifications: modifications)
            self.updateBusinessProgresses()

        case .error(let error):
            self.delegate?.notificationError(error)
        }
    }
}
每次更改后,我都会丢弃旧的进度并创建一个新的进度(如果进度存在,我会尝试保留一个引用并跳过创建;这对我遇到的问题没有任何影响)

每次收到进度通知时,我都会创建一个包含信息的新结构,并通过通知发送(以前我使用委托;但由于BusinessManager类是单例,因此我更喜欢使用通知):

我在同步进度的开始和结束时收到通知,而在这两者之间没有进度更新,这可能是什么原因


非常感谢您的指导。

Katsumi来自Realm。能否将可复制的项目或样本代码发送至
help@realm.io
?@kishikawakatsumi刚刚做到了。删除了原始项目的大部分代码,以便将其删除。问题依然存在。希望收到你的来信。谢谢!
func updateBusinessProgresses() {
    guard let businesses = remoteBusinesses else { return }
    for business in businesses {
        guard let realmUrl = business.realmSelf.configuration.syncConfiguration?.realmURL else { assert(false); return }
        guard let user = SyncUser.current else { assert(false); return }
        guard let session = user.session(for: realmUrl) else { assert(false); return }

        DLog("PROGRESS URL: \(realmUrl.description)")

        let uploadToken = session.addProgressNotification(for: .upload, mode: .reportIndefinitely, block: { progress in
            DLog("UPLOAD \(progress.transferrableBytes)")
            DispatchQueue.main.async {
                let object: [String:Double] = [business.uuid:progress.fractionTransferred]
                DLog("UPLOAD \(business.uuid), fractionTransferred: \(Int(progress.fractionTransferred*100))")
                NotificationCenter.default.post(name: Notification.Upload.name, object: object)
            }
        })

        let downloadToken = session.addProgressNotification(for: .download, mode: .reportIndefinitely, block: { progress in
            DLog("DOWNLOAD \(progress.transferrableBytes)")
            DispatchQueue.main.async {
                let object: [String:Double] = [business.uuid:progress.fractionTransferred]
                DLog("DOWNLOAD \(business.uuid), fractionTransferred: \(Int(progress.fractionTransferred*100))")
                NotificationCenter.default.post(name: Notification.Download.name, object: object)
            }
         })

        guard let _uploadToken = uploadToken, let _downloadToken = downloadToken else { assert(false); return }
        // hold a reference so that we keep getting the progresses
        syncTokens[business.uuid] = SyncNotificationToken(business: business, downloadToken: _downloadToken, uploadToken: _uploadToken)
    }
}