«Может удалить только объект из области, которой он принадлежит» - не может использовать универсальный метод - PullRequest
0 голосов
/ 20 сентября 2019

Я сохраняю Article в Realm, проблема возникает, когда я хочу удалить его.Я получаю сообщение об ошибке «Может удалить только объект из области, которой он принадлежит»

struct Article: Codable {
    let url: String
    private(set) var isSaved: Bool = false

    mutating func save(completed: @escaping (() -> Void) ) {
        DispatchQueue(label: "background").async {
            autoreleasepool {
                let container = try! Container()
                try! container.write { transaction in
                    transaction.add(self)
                    self.isSaved = true
                    completed()
                }
            }
        }
    }

    mutating func delete(completed: @escaping (() -> Void) ) {
        DispatchQueue(label: "background").async {
            autoreleasepool {
                let container = try! Container()
                try! container.write { transaction in
                    if let article = objectsToDelete.results.first {
                        self.isSaved = false
                        transaction.delete(self)
                        completed()
                    }
                }
            }
        }
    }
}

Код Boiler Plate для обработки Realm

final class ArticleObject: Object {
    @objc dynamic var url: String = ""

    override static func primaryKey() -> String? {
        return "url"
    }
}

extension Article: Persistable {
    public init(managedObject: ArticleObject) {
        url = managedObject.url
    }

    public func managedObject() -> ArticleObject {
        let article = ArticleObject()
        article.url = url

        return article
    }
}

extension Article {
    public enum Query: QueryType {
        case url(String)

        public var predicate: NSPredicate? {
            switch self {
            case .url(let value):
                return NSPredicate(format: "url == %@",
                                   value)
            }
        }

        public var sortDescriptors: [SortDescriptor] {
            return [SortDescriptor(keyPath: "url")]
        }
    }
}

Мой класс слоя Real имеет универсальныйметод для удаления объекта, но я должен был специально построить третий.

public final class WriteTransaction {
    private let realm: Realm

    internal init(realm: Realm) {
        self.realm = realm
    }

    public func add<T: Persistable>(_ value: T, update: Bool = false) {
        realm.add(value.managedObject(), update: update)
    }

    func delete<T: Persistable>(_ value: T) {
        realm.delete(value.managedObject())
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...