2016-06-23 4 views
0

Я хочу очистить все данные от объекта CoreData перед выполнением ввода более новых данных. Пока что я попытался удалить все, что не позволяет мне вставлять новые данные, даже при использовании одного и того же контекста для обеих операций. Есть ли лучший способ сделать это? Вот код, который я использовал. То, что я делаю, - удалить объект из старых записей, а затем сохранить контекст. Затем я вставляю новые объекты в контекст и, наконец, я просто его сохраняю. По-видимому, после его сохранения, когда я вспоминаю сохраненные данные из представления, он возвращает пустое.Вставка после удаления в NSManagedObjectContext

class DS_Objectives { 

let appDel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
let dateFormatter = NSDateFormatter() 

func storeObjectives(json: JSON) { 

let context:NSManagedObjectContext = appDel.managedObjectContext 
self.dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 
self.dateFormatter.timeZone = NSTimeZone(abbreviation: "UTC") 

let request : NSFetchRequest = NSFetchRequest.init(entityName: "EducationalObjective") 

context.performBlock{ 
    do{ 
     let oldObjectives = try context.executeFetchRequest(request) as! [NSManagedObject] 

     for obj in oldObjectives { 
      context.deleteObject(obj) 
     } 

     try context.save() 
    } catch { 
     print(error) 
    } 
} 

for (_,subJson):(String, JSON) in json { 

    var obj : EducationalObjective? = self.findObjective(Int(subJson["IdObjetivoEducacional"].stringValue)!) 

    if obj == nil { 
     obj = NSEntityDescription.insertNewObjectForEntityForName("EducationalObjective",inManagedObjectContext: context) as? EducationalObjective 
     obj!.setValue(Int(subJson["IdObjetivoEducacional"].stringValue), forKey: "id") 
    } 

    obj!.setValue(Int(subJson["Numero"].stringValue),    forKey: "numero") 
    obj!.setValue(Int(subJson["IdEspecialidad"].stringValue),  forKey: "especialidad") 
    obj!.setValue(subJson["Descripcion"].stringValue,    forKey: "descripcion") 
    obj!.setValue(subJson["CicloRegistro"].stringValue,    forKey: "cicloRegistro") 
    obj!.setValue(subJson["Estado"].boolValue,      forKey: "estado") 
    obj!.setValue(self.dateFormatter.dateFromString(subJson["updated_at"].stringValue), forKey: "updated_at") 

    for (_,res):(String,JSON) in json["students_results"] { 

     var edRes : StudentResult? = self.findStudentResult(Int(res["IdResultadoEstudiantil"].stringValue)!) 

     if edRes == nil { 
      edRes = NSEntityDescription.insertNewObjectForEntityForName("StudentResult",inManagedObjectContext: context) as? StudentResult 
      edRes!.setValue(Int(res["IdResultadoEstudiantil"].stringValue)!, forKey: "id") 
     } 

     edRes!.setValue(Int(res["IdResultadoEstudiantil"].stringValue), forKey: "id") 
     edRes!.setValue(res["Identificador"].stringValue, forKey: "identificador") 
     edRes!.setValue(res["Descripcion"].stringValue, forKey: "descripcion") 
     edRes!.setValue(res["CicloRegistro"].stringValue, forKey: "cicloRegistro") 
     edRes!.setValue(res["Estado"].boolValue, forKey: "estado") 
     edRes!.setValue(self.dateFormatter.dateFromString(res["updated_at"].stringValue)!, forKey: "updated_at") 

    } 
} 

do{ try context.save() } catch { print(error) } 
} 

ответ

0

context.performBlock расписание прилагаемого блок асинхронно по очереди контекста управляемого объекта. Поскольку вы используете этот метод для планирования удаления, но затем выполняете синхронное вложение (и, возможно, в неправильную очередь), вы вставляете новые объекты и затем удаляете все.

+0

Хорошо, но тогда как я могу предотвратить удаление после вставки? –

+0

Вы можете выполнять оба действия в одном и том же закрытии 'performBlock'. Вы можете выполнить каждое действие в своем собственном закрытии 'executeBlock', и это закрытие будет выполняться в том порядке, в котором они будут добавлены в очередь. Если вы знаете, что вы уже находитесь в правильной очереди параллелизма, вы можете полностью исключить «выполнитьBlock». – Jonah

+0

Извините, не работает, когда вы устанавливаете два внутри исполнения –