核心数据在后台插入大数据

Posted

技术标签:

【中文标题】核心数据在后台插入大数据【英文标题】:core data insert big data in background 【发布时间】:2015-07-23 08:46:50 【问题描述】:

我希望我的应用程序在后台将所有服务器信息加载到 Core Data 实体。我创建了名为“事件”的新实体,然后在其中创建了 5 个属性。另外,我为我的实体创建了 NSManagedObject 子类:

import Foundation
import CoreData

@objc(Event)
class Event: NSManagedObject 

    @NSManaged var category: String
    @NSManaged var date: String
    @NSManaged var event: String
    @NSManaged var location: String
    @NSManaged var time: String

这就是我如何加载所有数据并将其插入核心数据实体:

func loadAllData()
    println("loading all data")

    let params = ServerConstants.infoParam + "=true"

    // creating request, set its method to POST and append params to request
    var request = NSMutableURLRequest(URL: NSURL(string: ServerConstants.getInfoURL)!)
    request.HTTPMethod = "POST"
    request.HTTPBody = params.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)

    // start loading data in background
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) 
        var session = NSURLSession.sharedSession()
        var task = session.dataTaskWithRequest(request) (data, response, error) -> Void in
            if error == nil 
                let json = JSON(data: data)
                self.defaults.setObject(json["lastCategoriesId"].string, forKey: "lastCategoriesId")
                self.defaults.setObject(json["lastEventsId"].string, forKey: "lastEventsId")

                //println(json)
                var maxValue = Float(json["categories"].count + json["events"].count)
                println("maxself. - \(maxValue)")

                var error: NSError?
                var array = json["events"]

                let newItem = NSEntityDescription.insertNewObjectForEntityForName("Event", inManagedObjectContext: self.managedObjectContext!) as! Event

                for var i: Int = 0; i < array.count; i++                         
                    newItem.category = array[i]["category"].string!
                    newItem.event = array[i]["event"].string!
                    newItem.location = array[i]["location"].string!
                    newItem.date = array[i]["date"].string!
                    newItem.time = array[i]["time"].string!

                    println(i)
                
                if !self.managedObjectContext!.save(&error) 
                    println("Could not save \(error), \(error?.userInfo)")
                
                println("done")
            
        
        task.resume()
    

问题是我的 for 循环运行很慢。一次迭代约为 1 秒。我究竟做错了什么?数据大约有 3500 行。

这是我的 json:


    "lastEventsId" : "3602",
    "events" : [
        
            "date" : "lorem",
            "time" : "ipsum",
            "event" : "dolor",
            "category" : "sit",
            "location" : "amet"
        ,...

我试图运行这个 for 循环:

for var i: Int = 0; i < array.count; i++ 
    println(i)

它再次工作 1 次迭代 1 秒。但是,如果我只是将索引最大长度设置为 3500,它会迭代整个循环约 1 秒。

for var i: Int = 0; i < 3500; i++ 
    println(i)

【问题讨论】:

【参考方案1】:

也许 swift 每次都会计算 array.count,和 php count(array) 一样 尝试在 const 中定义 array.count

 let limit = array.count;
 for i in 0..<limit 
    //do your stuff
 

【讨论】:

以上是关于核心数据在后台插入大数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在后台线程中从 NSFetchedResultsController 加载大数据

技术浅谈大数据量下数据库查询插入的优化

带有核心数据和 NSFetchedResultsController 的后台线程

从程序员进阶到架构师,6大核心技能要领详解

大数据核心技术都有哪些

大数据三大核心技术:拿数据、算数据、卖数据!