2016-03-22 9 views
0

Ich versuche, einen Text von einer Website in einer iPhone App zu verwenden. Dazu benutze ich einen Web-Scrapper, Osmosis. Ich habe es geschafft, die gewünschten Daten abzurufen, aber ich kann die Daten in einem Array nicht beeinflussen, um sie außerhalb der Funktion zu verwenden. Hier ist ein Ausschnitt von dem, was ich getan habe:Verwenden Sie Daten aus einem Bereich außerhalb des Gültigkeitsbereichs

class ViewController: UIViewController { 

    @IBOutlet weak var quote: UILabel! 

    private var array: [[String: AnyObject]] = [] 


    var initArray: [[String: AnyObject]] { 
     get { 
      return array 
     } 
     set { 
      for e in self.initArray { 
       array.append(e) 
      } 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     getQuotes() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func getQuotes() 

     Osmosis(errorHandler: { (error) -> Void in 
      print(error) 
     }) 
      .get(NSURL(string: "http://www.example.com")!) 
      .find(OsmosisSelector(selector: ".parentDiv"), type: .CSS) 
      .populate([ 
       OsmosisPopulateKey.Single("quotes") : OsmosisSelector(selector: ".childDiv") 
       ], type: .CSS) 
      .list { (dict) -> Void in 
       self.array.append(dict) 
       print(self.initArray) // this prints data 
      } 
      .start() 
     print(self.initArray) // This prints an empty array 
    } 
} 

Ich glaube, ich nicht das Array verwenden kann, weil es in der init von Osmosis() gefüllt ist, aber ich frage mich, wie es in meinem Code irgendwo anders zu verwenden. Können Sie mir bitte erklären, was in meinem Code passiert (warum kann ich die Daten nur in .list() verwenden) und wie behebe ich das?

Edit: Ich habe versucht, einen Getter und einen Setter, um zu verwenden, um meine Daten außerhalb des Bereichs abzurufen, aber das Ergebnis ist das gleiche, als wenn es kein Getter/Setter waren.

+0

Ich weiß, dass mein Titel überhaupt nicht explizit ist, aber ich habe keine Ahnung, wie ich genauer sein könnte. Wenn Sie einen besseren Titel finden, ändern Sie ihn bitte. Prost – Mehdi

+0

Ein Problem ist, dass Ihr 'Array' vom Typ' [[String: AnyObject]] '' ist und Ihr 'quotesArray' vom selben Typ ist, aber Sie versuchen,' array' an 'quotesArray' anzuhängen: es kann arbeite nicht. Wenn Sie ein Array von Dictionaries an ein neues Container-Array anfügen möchten, sollte dieser Container den Typ '[[[String: AnyObject]]]] haben, aber ich bin mir nicht sicher, ob Sie das wirklich tun möchten ... – Moritz

+0

Ein weiteres Problem ist, dass 'print (self.array)' * außerhalb des Umfangs der Osmosis-Schließung * liegt, so dass Sie es betrachten, während es noch nicht * gefüllt * ist, also denken Sie, es ist leer. Setzen Sie 'print (self.array)' innerhalb des '.list' Blocks, direkt vor der schließenden Klammer, in die leere Zeile. – Moritz

Antwort

0

Basierend auf Christian Dietrich Antwort und Kommentare konnte ich mein Problem beheben, indem Sie die Benutzeroberfläche in meinem Rahmen zu aktualisieren.

Hier ist, was ich getan habe:

import UIKit 
import Osmosis 

class ViewController: UIViewController { 

    @IBOutlet weak var quote: UILabel! 

    var array: [[String: AnyObject]] = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     getQuotes() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func getQuotes() { 

     var updateText: String = "" 

     Osmosis(errorHandler: { (error) -> Void in 
      print(error) 
     }) 
      .get(NSURL(string: "http://www.exemple.com")!) 
      .find(OsmosisSelector(selector: ".wrapper"), type: .CSS) 
      .populate([ 
       OsmosisPopulateKey.Single("div") : OsmosisSelector(selector: ".div") 
       ], type: .CSS) 
      .list { (dict) -> Void in 
       self.array.append(dict) 
       updateText = self.array[0]["div"] as! String 
       self.quote.text = updateText 
       self.view.setNeedsDisplay() 
      } 
      .start() 
    } 
} 

Vielen Dank für Ihre Hilfe!

0

Sie möchten alle Elemente eines Arrays zu einem anderen Array hinzufügen?

for e in quotesArray { 
    self.array.append(e) 
} 

oder

self.array.appendContentsOf(quotesArray) 
+0

Ich möchte in der Tat Elemente von' array' zu 'quotesArray' hinzufügen. Ich habe versucht, beide Ihre Lösungen, aber es druckt eine leere Array ... – Mehdi

+0

Sind Sie sicher, Ihre API ist nicht asynchron? Hast du den Druck direkt nach dem Anhängen hinzugefügt? –

+0

Meine Vermutung ist, dass die API async ist und ich außerhalb des Bereichs drucke, da ich möchte, dass meine Daten überall verfügbar sind. – Mehdi

Verwandte Themen