Mein Problem tritt auf, wenn ich Daten aus meiner MySQL-Datenbank in ein Klassenobjekt füllen möchte. Ich versuche, ein Array von Objekten zurückzugeben und es gibt nil
zurück und dann füllt es sich irgendwie. Wie kann ich es füllen, bevor ich das leere Array zurückschicke?NSURLSession.sharedSession(). DataTaskWithRequest läuft langsam in Funktion
Hier ist mein Code und ein Screenshot von Codeausgabe
import Foundation
class Research
{
var mainResearchImageURL:String = ""
var userProfileImageURL:String = ""
var caption:String = ""
var shortDescription:String = ""
init(mainResearchImageURL :String, userProfileImageURL:String, caption:String, shortDescription:String)
{
self.mainResearchImageURL = mainResearchImageURL
self.userProfileImageURL = userProfileImageURL
self.caption = caption
self.shortDescription = shortDescription
}
class func downloadAllResearches()->[Research]
{
var researches = [Research]()
let urlString = "http://localhost/test/index.php"
let request = NSMutableURLRequest(URL: NSURL(string: urlString)!)
request.HTTPMethod = "POST"
let postString = "action=listresearches"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: {data, response, error in
if (error == nil) {
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSArray
//let dictionary = json!.firstObject as? NSDictionary
var counter:Int = 0;
for line in json!{
let researchData = line as! NSDictionary
let researchLineFromData = Research(mainResearchImageURL: researchData["research_mainImageURL"] as! String, userProfileImageURL: researchData["research_creatorProfileImageURL"] as! String, caption: researchData["research_caption"] as! String, shortDescription: researchData["research_shortDescription"] as! String)
researches.append(researchLineFromData) //researches bir dizi ve elemanları Research türünde bir sınıftan oluşuyor.
counter += 1
print ("counter value \(counter)")
print("array count in loop is = \(researches.count)")
}
}catch let error as NSError{
print(error)
}
} else {
print(error)
}})
task.resume()
print("array count in return is = \(researches.count)")
return researches
}
}
Und dies ist die Ausgabe:
Das Problem, das Sie haben, ist kein "Problem". Swift tut Ihnen einen Gefallen, indem Sie Webanfragen im Hintergrund ausführen und Ihre Anwendung nicht halten, wenn diese fertig ist. Sie müssen nur entsprechend damit umgehen. Ich würde in Versandgruppen suchen. Sie ermöglichen Ihnen, Code auszuführen, sobald eine Aufgabe abgeschlossen ist. Überprüfen Sie diese Antwort hier: http://stackoverflow.com/questions/35906568/wait-until-swift-for-loop-with-asynchronous-network-requests-finishes-executing/35906703#35906703 –