2016-07-18 2 views
0

Ich habe diesen Aufruf api Funktion aufzurufen versuchen:Array leer zurück, wenn von außerhalb der Funktion [swift]

func searchResults(){ 


    let urlString = "http://dev.jocom.com.my/feed" 


    Alamofire.request(.POST, urlString , parameters: ["req" : "pro_name", "code" : searchString!]) 

     .responseData { response in 

      switch response.result { 
      case .Success: 

       let apiSearchXML = SWXMLHash.parse(response.data!) 

       for elem in apiSearchXML["rss"]["channel"]["item"]{ 
        self.imageURL.append(elem["thumb_1"].element!.text!) 

        self.name.append(elem["name"].element!.text!) 



       } 
       print(self.name) 

      case .Failure(let error): 
       print(error) 
      } 
    } 

} 

Es scheint ok, wenn ich den Ausgang aus drucken, wobei die Anordnung seiner enthält etwas. Aber wenn ich versuche, es aufzurufen, um es in meiner Sammlungsansicht anzuzeigen, gibt es keine Zeile zurück, und es wird leer, warum ist es?

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 

    return 1 
} 


func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 

    return self.name.count 

} 


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! SearchResultsCollectionViewCell 

    cell.titleLabel.text = "abc" 
    cell.setNeedsDisplay() 
    return cell 
} 
+0

Die Alamofire Readme erwähnt ausdrücklich, dass die Anforderung ausgeführt werden * asynchron *. Sehen Sie sich die häufig gestellten [alamofire] Fragen an: Diese wurden wiederholt gestellt und beantwortet. –

Antwort

0

Sie benötigen einen Beendigungshandler für Ihren Async Aufruf, um abzuschließen und dann können Sie das Array mit den Ergebnissen füllen. Ich glaube, Ihr name ist ein Array von Strings. Machen Sie es wie so:

func searchResults(complete: (names: [String]) ->()){ 
let aVar = [String]() 
//your code 
for elem in apiSearchXML["rss"]["channel"]["item"]{ 

aVar.append(elem["name"].element!.text!) 
} 
complete(names: aVar) 
//your code 
} 

Dann, wenn Sie es nennen, wie so:

searchResults { theNames in 
print(theNames) 
//Here you have your array of names, use how you want. 
} 
+0

es funktioniert! Danke, so viel! D: – mimi93

+0

Ich bin froh zu helfen. Glückliche Kodierung! :) – Dershowitz123

0

sollten Sie

nennen
dispatch_async(dispatch_get_main_queue()) { 
    collectionView.reloadData() 
} 

wenn Sie einen Rückruf vom Server erhalten.

+0

wo sollte ich es hinzufügen? – mimi93

+0

direkt vor 'print (self.name)' – fiks

+0

nein, es funktioniert immer noch nicht – mimi93

0

"Die Vernetzung in Alamofire erfolgt asynchron."

Dies bedeutet, dass Ihre Anfrage eine unbekannte Zeit nach dem Aufruf searchResults abschließt.

Ihre beste Strategie besteht darin, Ihre Sammlungsansicht innerhalb Ihres Erfolgsblocks zu aktualisieren. (Stellen Sie sicher, dass Sie UI-Updates für den Hauptthread vornehmen.)

+0

Wie soll ich es tun? Entschuldigung, ich bin sehr neu in swift – mimi93

+0

kann mir irgendein Beispiel zur Verfügung stellen? – mimi93

Verwandte Themen