Как инициализировать переменные в классе объекта @NSManaged в виде значения JSON? - PullRequest
0 голосов
/ 11 июня 2018

Я хочу инициализировать переменные в классе «Item», как переменные класса «Item2»

это класс «Item»: -

import UIKit
import CoreData
import SwiftyJSON

class Item: NSManagedObject {

    @NSManaged var name = String()
    @NSManaged var symbol = String()
    @NSManaged var checked : Bool = false
    @NSManaged var buyPrice = String()
    @NSManaged var rank = String()

}

это «Item2»Класс: -

import Foundation
import SwiftyJSON

class Item2 : Codable {

    var name = String()
    var symbol = String()
    var checked : Bool = false
    var buyPrice = String()
    var rank = String()

    init(bitJSON: JSON) {
        self.name       = bitJSON["name"].stringValue
        self.symbol     = bitJSON["symbol"].stringValue
        self.buyPrice   = bitJSON["price_usd"].stringValue
        self.rank       = bitJSON["rank"].stringValue
    }

}

1 Ответ

0 голосов
/ 12 июня 2018

ManagedObject не является обычным объектом.Это объектно-ориентированный способ оценки базы данных.Управляемые объекты используют контекст для получения всех своих свойств.Управляемый объект должен иметь контекст - он просто не работает без него.

extension Item {
    static func insert(json:JSON, in context:NSManagedObjectContext) -> Item{
        let newItem = Item.init(entity: Item.entity(), insertInto:context)
        newItem.name       = json["name"].stringValue
        newItem.symbol     = json["symbol"].stringValue
        newItem.buyPrice   = json["price_usd"].stringValue
        newItem.rank       = json["rank"].stringValue
    }
}

Обратите внимание на две вещи об этом методе: 1) он не предполагает, что он знает контекст - это работа для высшегоуровень - для некоторых приложений он просто вставляется прямо в viewContext, для других приложений создается временный фоновый контекст.и 2) он не сохраняет контекст - это тоже не его работа - другой объект может быть отредактирован или создан одновременно, и все они должны быть сохранены транзакционно.

Он будет использоваться, например, так:

persistentContainer.performBackgroundTask { (context) in
    let newItem = Item.insert(json: json, in: context)
    do {
        try context.save()
    } catch {
        // log to you analytic provider
    }
}

Надеюсь, это поможет.

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