2015-07-23 4 views
1

Я хочу, чтобы мое приложение загрузило всю информацию о сервере в объект 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() 
    } 
} 

Проблема заключается в том, что мой для цикл работает очень медленно. Одна итерация составляет ~ 1 секунду. Что я делаю не так? Данные составляют около 3500 строк.

Вот мой JSON:

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

Я попытался запустить этот цикл:

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) 
} 

ответ

0

возможно быстрое просчитывает каждый раз в array.count, так же, как графа PHP (массив) попытаться определить array.count в константной

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

Да оно, i'he пробовал раньше и оно работает. – mikle94