2015-07-23 1 views
1

Je souhaite que mon application charge toutes les informations du serveur vers l'entité de base de données en arrière-plan. J'ai créé une nouvelle entité appelée 'Evénement' puis créé 5 attributs dedans. En outre, j'ai créé la sous-classe NSManagedObject pour mon entité:données de base insérer des données volumineuses en arrière-plan

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 
} 

Et voici comment je charger toutes les données et que vous souhaitez l'insérer à noyau entité de données:

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

Le problème est que mon pour La boucle fonctionne très lentement. Une itération est ~ 1 seconde. Qu'est-ce que je fais mal? Les données sont d'environ 3500 lignes.

Voici mon JSON:

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

J'ai essayé d'exécuter cette boucle:

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

et encore, il travaille 1 itération pour 1 seconde. Mais si je mets juste la longueur max de l'index à 3500, itère la boucle entière pendant ~ 1 sec.

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

Répondre

0

peut-être rapide calcule chaque fois que le array.count, même que le nombre de php (tableau) essayer de définir array.count dans un const

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

Oui, il est, i'he essayé plus tôt et Ça marche. – mikle94