Ответ 1
В отношениях "один ко многим" легче установить "одно" направление обратные отношения, в вашем случае просто
list.board = board
так что методы расширения на самом деле здесь не нужны.
У меня есть отношение "один ко многим", которое выглядит так,
Я установил классы модели в файле, чтобы он соответствовал:
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
правильно указывает правую доску и список.)
Спасибо заранее!
В отношениях "один ко многим" легче установить "одно" направление обратные отношения, в вашем случае просто
list.board = board
так что методы расширения на самом деле здесь не нужны.
Вы должны вызывать 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)
}
}
Если вы определяете:
@NSManaged var lists: Set<List>
Затем вы можете сделать:
board.lists.insert(list)