5

アプリで CloudKit を使用しており、WWDC ビデオ「CloudKit のベスト プラクティス」のベスト プラクティスに従うことから始めました。

最初に行うことは、私が好きな変更を確認することです。

let changesOperation = CKFetchDatabaseChangesOperation(previousServerChangeToken: databaseChangeToken)
changesOperation.fetchAllChanges = true
changesOperation.recordZoneWithIDChangedBlock = { self.recordZoneWithIDChanged($0) }
changesOperation.recordZoneWithIDWasDeletedBlock = { self.recordZoneWithIDWasDeleted($0) }
changesOperation.changeTokenUpdatedBlock = { self.changeTokenUpdate($0) }
changesOperation.fetchDatabaseChangesCompletionBlock = { self.fetchDatabaseChangesCompletion($0, isMoreComing: $1, error: $2) }

privateDatabase.add(changesOperation)

フェッチを設定しているプラ​​イベート データベースにレコードがありますが、取得できるのはchangeTokenUpdatedBlockとだけfetchDatabaseChangesCompletionです。

recordZoneWithIDChangedBlockこの操作を実行すると、ヒットが発生し、プライベート データベースのデフォルト ゾーンがこのブロックに渡されることを期待する必要があると言うのは正しいですか?

これは、 my を呼び出したときにfetchDatabaseChangesCompletion、レコード ゾーン ID の配列が空であるため、取得するものが何もないことを意味します: (注意、errornil です)

fileprivate func fetchDatabaseChangesCompletion(_ newToken: CKServerChangeToken?, isMoreComing: Bool, error: Error?)
{
    if let error = error
    {
        //  Handle error

        return
    }

    let fetchZoneChangesOperation = CKFetchRecordZoneChangesOperation(recordZoneIDs: changedRecordZoneIDs,
                                                                      optionsByRecordZoneID: nil)
    fetchZoneChangesOperation.recordChangedBlock = { self.recordChanged($0) }
    fetchZoneChangesOperation.recordWithIDWasDeletedBlock = { self.recordWithIDWasDeleted($0, string: $1) }
    fetchZoneChangesOperation.recordZoneFetchCompletionBlock = { self.recordZoneFetchCompletion($0, newChangeToken: $1, clientSentChangeTokenData: $2, isMoreComing: $3, error: $4) }
    fetchZoneChangesOperation.completionBlock = { self.fetchRecordZoneChangesCompletion() }

    privateDatabase.add(fetchZoneChangesOperation)
}
4

1 に答える 1