Swift - 核心数据。收集在枚举时发生变异

时间:2017-02-10 10:57:13

标签: swift multithreading core-data

我真的看到了关于标题的所有答案,但所有这些都是用Objetive-C编写的,在Swift中有任何想法吗?

这是我的代码:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let respuesta = self.funcCoreData.obtenerResultados(entidad: "Clientes", orden: "nombre_comercial", ascendente: true)
    self.objeto = respuesta[0] as! NSFetchRequest<NSManagedObject>
    self.resultados = respuesta[1] as! NSFetchedResultsController<NSManagedObject>
    do {
        try self.resultados.performFetch()
        if self.funcCoreData.objetoLleno(objeto: self.objeto) {
            self.pintarSecciones()
        }
    } catch {
        print(" \(error)")
    }
}

文件funcCoreData.swift

func obtenerResultados(entidad: String, orden: String, ascendente: Bool) -> [AnyObject] {
    let appDelegate = UIApplication.shared.delegate as? AppDelegate
    let context = appDelegate?.persistentContainer.viewContext
    let objeto = recorrerObjeto(entidad: entidad, orden: orden, ascendente: ascendente)
    let recorrerResultados = NSFetchedResultsController<NSManagedObject>(fetchRequest: objeto, managedObjectContext: context!, sectionNameKeyPath: "seccionLetra", cacheName: nil)

    var array = [AnyObject]()
    array.append(objeto)
    array.append(recorrerResultados)

    return array
}

func recorrerObjeto(entidad: String, orden: String, ascendente: Bool) -> NSFetchRequest<NSManagedObject> {
    let objeto = NSFetchRequest<NSManagedObject>(entityName: entidad)
    let ordenacion = NSSortDescriptor(key: orden, ascending: ascendente, selector: #selector(NSString.caseInsensitiveCompare))
    objeto.sortDescriptors = [ordenacion]
    return objeto
}

我必须放一个帖子,比如DispatchQueue.global(qos: .background).async,但是,我不知道在哪里!

1 个答案:

答案 0 :(得分:0)

您不需要包含fetchRequest和fetchedResultsController的数组。这使得代码不必要地复杂化。您可以获取从fetchedResultsController fetchedObjects属性获取的对象,如果需要fetchRequest,可以从fetchedResultsController.fetchRequest获取它。

我不知道self.funcCoreData.objetoLleno或self.pintarSecciones正在做什么,但我怀疑这是不必要的并导致崩溃。如果您有通过fetchedResultsController.fetchedObjects枚举的代码,那么您必须在执行此操作之前复制对象。

可以在循环播放时更改fetchedObjects。