Swift JSON 保存问题

Posted

技术标签:

【中文标题】Swift JSON 保存问题【英文标题】:Swift JSON Saving issue 【发布时间】:2015-03-20 14:27:39 【问题描述】:

使用 Master/Detail Core Data 模板时,我遇到了一个奇怪的问题,但想象这只是我的头脑。当解析一个包含大约 800 名学生的 JSON 文件时,这些项目几乎会立即添加到 TableView 中,这很好。我遇到的问题是,当尝试将它们保存到 Core Data 上下文时,应用程序似乎暂停了近一分钟。

@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()


【问题讨论】:

【参考方案1】:

首先,您进行了 800 次保存。尝试在循环之外做它们,或者更好的是,做他们的应用程序。每 400 条记录 2 次。

其次,您的核心数据保存发生在不同的线程上。考虑保存在获取结果控制器所在的主线程上。后台线程有利于保存大量数据,这里似乎不是这样。

【讨论】:

以上是关于Swift JSON 保存问题的主要内容,如果未能解决你的问题,请参考以下文章

在 [CLLocation] SWIFT 中保存 JSON 结果

AFNetworking 和 Swift - 保存 json 响应

如何在swift中将json数组保存和检索到用户默认值?

保存 json 响应并将其解析为 swift 对象

Swift - 如何在安装前将 json 文件保存在应用程序中

如何在 Swift 中将 JSON 数据保存到 UserDefault? [复制]