Сохранение отношений CoreData to-many в Swift

У меня есть отношение "один ко многим", которое выглядит так,

coredata model

Я установил классы модели в файле, чтобы он соответствовал:

import CoreData
import Foundation

class Board: NSManagedObject {
    @NSManaged var boardColor: String
    @NSManaged var boardCustomBackground: AnyObject?
    @NSManaged var boardID: String
    @NSManaged var boardName: String
    @NSManaged var lists: NSSet
}

class List: NSManagedObject {
    @NSManaged var listID: String
    @NSManaged var listName: String
    @NSManaged var board: Board
}

Поскольку я извлекаю данные из нескольких конечных точек JSON, мне приходится отдельно сохранять свои списки с моих плат. Что я хочу сделать, это создать/обновить список для платы с соответствующим идентификатором boardID.

Здесь, где я после нескольких попыток:

func saveList(boardID: String, listName: String, listID: String) {
    let request = NSFetchRequest(entityName: "Board")
    var error: NSError? = nil
    request.predicate = NSPredicate(format: "boardID like %@", boardID)
    let results: NSArray = context.executeFetchRequest(request, error: &error)
    if results.count > 0 {
        for result in results {
            let board = result as Board
            let list = NSEntityDescription.insertNewObjectForEntityForName("List", inManagedObjectContext: context) as List
            println("💃 want to save \(listName) in \(board.boardName)")
            board.lists.addListObject(lists)
            list.listName = listName
            list.listID = listID
        }
    }
}

Основываясь на Определении отношений CoreData в Swift и this, я попытался реализовать ответ @Keenle для определения список объектов внутри доски:

import Foundation

extension Board {
    func addListObject(value:List) {
        var items = self.mutableSetValueForKey("lists");
        items.addObject(value)
    }

    func removeListObject(value:List) {
        var items = self.mutableSetValueForKey("lists");
        items.removeObject(value)
    }
}

Однако в board.lists.addListObject(lists) я столкнулся с следующей ошибкой: "NSSet" не имеет члена с именем "addListObject"

Вместо board.lists.addListObject(lists) я также попробовал board.lists.listName = listName как подразумевалось в этом примере Obj-C, но это, к сожалению, тоже не сработало.

(Кроме того, вывод println правильно указывает правую доску и список.)

Спасибо заранее!

Ответы

Ответ 1

В отношениях "один ко многим" легче установить "одно" направление обратные отношения, в вашем случае просто

list.board = board

так что методы расширения на самом деле здесь не нужны.

Ответ 2

Вы должны вызывать addListObject(...) объект board:

board.addListObject(list) // notice that we pass just one object

Дополнительно, если вы хотите добавить набор списков в конкретный объект board, вы можете расширить расширение board класса с помощью методов, которые принимают множество объектов:

func addList(values: NSSet) {
    var items = self.mutableSetValueForKey("lists");
    for value in values {
        items.addObject(value)
    }
}

func removeList(values: NSSet) {
    var items = self.mutableSetValueForKey("lists");
    for value in values {
        items.removeObject(value)
    }
}

Ответ 3

Если вы определяете:

@NSManaged var lists: Set<List>

Затем вы можете сделать:

board.lists.insert(list)