2017-03-06 6 views
0

So habe ich eine Reihe von Bildern, die ich aus meinen xcassets zu Demonstrationszwecken zugegriffen habe. Es gibt 150 Bilder, die ich versuche, mit Parser-Frameworks auf meinem Parse-Server zu speichern. Hier ist der Code, den ich bisher habe. Das Problem, das ich habe, ist meine App CPU geht zu 100% in den Tests und fällt auf 0. Auch die Bilder werden nicht gespeichert, um zu analysieren. Ich hatte gehofft, dass jemand mir helfen könnte, eine effiziente Methode zu finden, um 150 Bilder zu analysieren.Speichern mehrerer Bilder zu Parse

var imageNameList: [String] { 
    var imageNameList2:[String] = [] //[NSMutableArray]() 
    for i in 0...149 { 
     let imageName = String(format: "pic_%03d", Int(i)) 
     imageNameList2.append(imageName) 
    } 
    return imageNameList2 
} 
@IBAction func Continue(_ sender: Any) { 
     for imageName in imageNameList { 
      var objectForSave:PFObject = PFObject(className: "Clo") 
      let object:UIImage = UIImage(named: imageName)! 
      let tilesPF = imageNameList.map({ name in 
       let data = UIImagePNGRepresentation(object as! UIImage)! 
       let file = PFFile(data: data) 

       let tile = PFObject(className: "Tile") 
       tile["tile"] = file 
      }) 

      objectForSave["tiles"] = tilesPF 

      objectForSave.saveInBackground(block: { responseObject, error in 

       //you'll want to save the object ID of the PFObject if you want to retrieve a specific image later 
      }) 


     } 

} 
+0

können Sie eine Antwort in objective-c behandeln? – danh

+0

ja, ich werde nehmen, was ich bekomme – john

+0

@danh verstehst du meine Situation obwohl – john

Antwort

1

Das Problem ist, dass das enge for-Schleife gleichzeitig alle diese Anfragen startet einen Teil des HTTP-Stack-was bewirkt, daß Engpass.

Stattdessen läuft die Anfragen der Reihe nach als (in meiner besten Annäherung an Swift) folgt ...

func doOne(imageName: String, completion: (success: Bool)->()) { 
    var objectForSave:PFObject = PFObject(className: "Clo") 
    let object:UIImage = UIImage(named: imageName)! 
    // ... OP code that forms the request 
    objectForSave.saveInBackground(block: { responseObject, error in 
     success(error == nil) 
    }) 
} 

func doMany(imageNames: Array<String>, completion: (success: Bool)->()) { 
    if (imageNames.count == 0) return completion(YES) 
    let nextName = imageNames[0]; 

    self.doOne(imageName:imageNames[0] completion: {(success: Bool) -> Void in 
     if (success) { 
      let remainingNames = imageNames[1..imageNames.count-1] 
      self.doMany(imageNames: remainingNames completion:completion) 
     } else { 
      completion(NO) 
    }) 
} 

In Englisch, nur für den Fall, dass ich den Swift gepatzt, die Idee, einen einzigen Antrag ausklammern ist in seine eigene Funktion mit einem Abschluss-Handler. Erstellen Sie eine zweite Funktion, die der Netzwerkanforderung ein Array von Argumenten entnimmt und dieses Array wie eine To-Do-Liste verwendet: Wenn das erste Element in der Liste ausgeführt wird, ruft es sich rekursiv auf, um die verbleibenden Elemente auszuführen.

+0

Ich habe eine Frage. Was ist getan und was? Xcode sagt, dass es diese Skripte nicht erkennt. Gibt es etwas, das du weggelassen hast? – john

+0

@john, das ist nur meine Annäherung an swift. Es veranschaulicht den Algorithmus nicht die genaue Syntax. Ich dachte, ich wäre mir darüber klar gewesen. – danh