2015-03-20 4 views
0

Использование шаблона основных данных ядра Я столкнулся с странной проблемой, но представьте, что это просто я над головой. При разборе файла JSON, содержащего примерно 800 студентов, элементы почти мгновенно добавляются в TableView, что хорошо. Проблема, с которой я сталкиваюсь, заключается в том, чтобы попытаться сохранить их в контексте Core Data, приложение кажется приостановлено на минуту.Swift JSON Проблема с сохранением

@IBAction func loadStudents(sender: AnyObject) { 

    var appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
    var context: NSManagedObjectContext = appDel.managedObjectContext! 

    let urlPath = NSURL(string: "**URL REMOVED**") 
    let sharedSession = NSURLSession.sharedSession() 
    let task = sharedSession.dataTaskWithURL(urlPath!, completionHandler: { (data, response, downloadTaskError) -> Void in 

     println("Download Complete") 

     if (downloadTaskError != nil) { 

      println("Download Error: \(downloadTaskError!.localizedDescription)") 

     } else { 

      var studentJSONParseError: NSError? 
      var studentJSONData = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &studentJSONParseError) as NSArray 

      if (studentJSONParseError != nil) { 

       println("JSON Parsing Error: \(studentJSONParseError!.localizedDescription)") 

      } else { 

       for var i = 0; i < studentJSONData.count; i++ { 

        var student = studentJSONData[i] as NSDictionary 
        println("\(i) \(student)") 
        var newStudent = NSEntityDescription.insertNewObjectForEntityForName("Student", inManagedObjectContext: context) as Student 
        newStudent.firstName = student["STUDENT_FIRSTNAME"] as NSString 
        newStudent.lastName = student["STUDENT_SURNAME"] as NSString 
        newStudent.usualName = student["STUDENT_USUAL"] as NSString 
        newStudent.grade = student["STUDENT_GRADE"] as NSNumber 
        newStudent.id = student["STUDENT_ID"] as NSString 
        context.save(nil) 

       } 
      } 
     } 
    }) 

    task.resume() 

} 

ответ

0

Во-первых, вы делаете 800 сейвов. Попробуйте сделать это за пределами цикла или, что еще лучше, сделайте это приложение. 2 раза каждые 400 записей.

Во-вторых, сохранение ваших основных данных происходит в другом потоке. Рассмотрите экономию на основном потоке, где живет ваш получатель результатов. Фоновые потоки хороши для сохранения большого количества данных, что, похоже, не здесь.