Как перезагрузить ячейки CloudKit с отредактированными изменениями - PullRequest
0 голосов
/ 05 октября 2018

Я создаю простое приложение To-Do List, используя CloudKit в качестве базы данных.В настоящее время я могу добавлять и удалять объекты, но я не согласен с редактированием объекта.

EditItemController

protocol EditItemControllerDelegate {
func editItemController(_ controller: EditItemController, didFinishEditing item: ItemCK)
}

class EditItemController: UIViewController {

var delegate: EditItemControllerDelegate?
var itemToEdit: ItemCK?

let itemTextField: UITextField = {
    let textField = UITextField()
    textField.placeholder = "Hello"
    return textField
}()

@objc func handleSave() {

        if let item = itemToEdit {
            guard let itemName = self.itemTextField.text else { return }
            item.name = itemName
            delegate?.editItemController(self, didFinishEditing: item)
        }
    }

ItemController

class ItemController: UITableViewController, UITextFieldDelegate, EditItemControllerDelegate {

func editItemController(_ controller: EditItemController, didFinishEditing item: ItemCK) {

    if let index = itemsModel.items.index(of: item) {
        let indexPath = IndexPath(row: index, section: 0)
        if let cell = tableView.cellForRow(at: indexPath) as? ItemCell {
            cell.itemLabel.text = item.name
            print(item.name)
        }
    }
}

Таким образом, когда я редактирую объект, ячейка табличного представления перезагружается с новыми данными объекта.но когда я провожу назад, он возвращается к исходному объекту.Кажется, не хранится в базе данных.Как мне отредактировать объект, сохранить его, а затем представить его в ячейке табличного представления?

What app currently look like

CloudKit Code

class ItemCK: NSObject {
static let recordType = "Item"
static let keys = (name: "title")

var record: CKRecord
init(record: CKRecord) {
    self.record = record
}

override init() {
    record = CKRecord(recordType: ItemCK.recordType)
}

var name: String {
    get {
        return record.value(forKey: ItemCK.keys.name) as! String
    }
    set {
        record.setValue(newValue, forKey: ItemCK.keys.name)
    }
  }
}


class ItemModel {
private let database = CKContainer.default().privateCloudDatabase

var items = [ItemCK]() {
    didSet {
        self.notificationQueue.addOperation {
            self.onChange?()
        }
    }
}

var onChange: (() -> Void)?
var onError : ((Error) -> Void)?
var notificationQueue = OperationQueue.main

var records = [CKRecord]()
var insertedObjects = [ItemCK]()
var editedObjects = ItemCK()
//to keep track of deleted objects
var deletedCKObjectIds = Set<CKRecord.ID>()

init() {
}

func addCategory(name: String) {
    print("Adding item")
    let item = ItemCK()
    item.name = name
    database.save(item.record) { (_, error) in
        guard error == nil else {
            self.handle(error: error!)
            return
        }
    }

    insertedObjects.append(item)
    updateItem()
}

func editItem() {
    let privateDatabase = database
    var predicate= NSPredicate   
}

func delete(at index: Int) {
    print("Deleting item")
    let recordId = self.items[index].record.recordID
    database.delete(withRecordID: recordId) { (_, error) in
        guard error == nil else {
            self.handle(error: error!)
            return
        }
    }

    deletedCKObjectIds.insert(recordId)
    updateItem()
}

@objc func refresh() {
    print("refreshing")
    let query = CKQuery(recordType: ItemCK.recordType, predicate: NSPredicate(value: true))
    database.perform(query, inZoneWith: nil) { (records, error) in
        guard let records = records, error == nil else {
            self.handle(error: error!)
            return
        }
        self.records = records
        self.updateItem()
    }
}

private func updateItem() {

    print("Updating item")
    var knownIds = Set(records.map {$0.recordID})

    self.insertedObjects.removeAll { (item) -> Bool in
        knownIds.contains(item.record.recordID)
    }

    knownIds.formUnion(insertedObjects.map {$0.record.recordID})

    self.deletedCKObjectIds.formIntersection(knownIds)
    var items = records.map { (record) in ItemCK(record: record) }

    items.append(contentsOf: insertedObjects)
    items.removeAll { (items) -> Bool in
        deletedCKObjectIds.contains(items.record.recordID)
    }

    self.items = items

}
}

Извините за длинный исходный код.CloudKit настолько сбивает с толку, IDK, какой информацией важно поделиться или нет

1 Ответ

0 голосов
/ 06 октября 2018

database.save в вашей функции updateItem ().

Когда вы сохраняете запись с новым RecordID, она вставляет запись.

Когда вы сохраняете запись с RecordID, которая соответствует существующей записи, она перезаписывает запись (в зависимости от вашегонастройки разрешения конфликтов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...