核心数据后台插入大数据
core data insert big data in background
我希望我的应用程序在后台将所有服务器信息加载到核心数据实体。我创建了名为 'Event' 的新实体,然后在其中创建了 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)
}
可能 swift 每次计算 array.count,与 php count(array) 相同
尝试在 const
中定义 array.count
let limit = array.count;
for i in 0..<limit {
//do your stuff
}
我希望我的应用程序在后台将所有服务器信息加载到核心数据实体。我创建了名为 'Event' 的新实体,然后在其中创建了 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)
}
可能 swift 每次计算 array.count,与 php count(array) 相同 尝试在 const
中定义 array.count let limit = array.count;
for i in 0..<limit {
//do your stuff
}