2017-01-27 2 views
2

Ich bin neu in iOS. Ich habe versucht, einen einfachen RSS-Reader mit MWFeedParser zu bauen. Ich bekomme keinen Build-Fehler, der Simulator erscheint gut, aber der Simulator zeigt keine RSS-Feeds an, sondern nur das leere TableView. Ich kann nicht daran denken, was falsch ist. Jede Hilfe wird sehr geschätzt. Vielen Dank.Ich weiß nicht, was mit meinem Code falsch ist (RSS Reader mit MWFeedParser)

// FeedTableViewController.swift 
// RssReader 

import UIKit 
import MWFeedParser 

class FeedTableViewController: UITableViewController, MWFeedParserDelegate { 

    var feedItems = [MWFeedItem]() 

    func request() { 

     let url = NSURL(string: "http://feeds.nytimes.com/nyt/rss/Technology") 
     //creating a feedparser object 
     let feedParser = MWFeedParser(feedURL: url as URL!) 
     feedParser?.delegate = self 
     feedParser?.parse() 

    } 


    // MARK: - FEED PARSER DELEGATE 

    func feedParserDidStart(_ parser: MWFeedParser!) { 
     feedItems = [MWFeedItem]() 
    } 


    func feedParserDidFinish(_ parser: MWFeedParser!) { 
     self.tableView.reloadData() 
    } 

    func feedParser(_ parser: MWFeedParser!, didParseFeedInfo info: MWFeedInfo!) { 
     print(info) 
     self.title = info.title 
    } 

    func feedParser(_ parser: MWFeedParser!, didParseFeedItem item: MWFeedItem!) { 
     feedItems.append(item) 
    } 



    override func viewDidLoad() { 
     super.viewDidLoad() 
      } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     request() 

    } 


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


    // MARK: - Table view data source 


    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     //height for rows 
     return 100 
    } 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     // return the number of sections 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // return the number of rows 
     return feedItems.count 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 

     // Configure the cell... 
     let item = feedItems[indexPath.row] as MWFeedItem 
     cell.textLabel?.text = item.title 

     return cell 
    } 

} 
+0

Ich bin mir nicht sicher, wie diese Bibliothek funktioniert, aber wahrscheinlich nichts, was sich an Ihrem FeedParser festhält, und es wird gleich nach dem Start der Anfrage freigegeben. Versuchen Sie, eine Eigenschaft zu verwenden, sodass Sie eine starke Referenz auf den Parser haben. – Moxy

+0

@Moxy Vielen Dank, dass Sie sich die Zeit genommen haben, zu antworten. Ich habe dieses Programm vollständig auf einem Tutorial [https://www.youtube.com/watch?v=jootsUaCvAU] basiert, aber es auf meine Art und Weise durchgeführt. Könnten Sie bitte helfen, die Verwendung von Eigenschaften, die eine starke Referenz enthalten, näher auszuführen? Danke noch einmal. –

Antwort

0

Eigentlich bist du Code funktioniert nicht, weil Sie ATS nicht respektieren. Mit anderen Worten, Ihr Feed ist in HTTP und nicht in HTTPS.

Sie sollten die folgende Meldung angezeigt, wenn Sie die Konsole öffnen

App Transport Security eine unverschlüsselt HTTP blockiert hat (http: //) Ressourcenbelastung, da es unsicher ist. Temporäre Ausnahmen können über die Info.plist-Datei Ihrer App konfiguriert werden.

Sie können dieses Problem lösen, indem eine Ausnahme in der info.plist

Einstellung info.plist screenshot

Aber bedenke, dass Apple nicht ATS Ausnahmen in naher Zukunft übernehmen.

+0

Danke für die Hilfe. Du hattest absolut recht mit dem ATS Fehler, ich bekomme genau das gleiche auf meiner Konsole aufgedruckt. Ich habe alle Änderungen vorgenommen, wie Sie vorgeschlagen haben, aber das hat es nicht behoben. Ich bekomme immer noch den gleichen ATS-Fehler. Ich putzte das Projekt und führte es erneut aus. Ich habe sogar 'AllowArbitraryLoads' unter ATSS versucht und es auf 'YES' gesetzt, aber es hat immer noch nicht geholfen. Ich bin mir nicht sicher, was ich falsch mache. Ich habe versucht, umzuschreiben, wie Sie wieder zeigen, aber ich weiß nicht, dass es nicht funktioniert. Falls es relevant ist, verwende ich Xcode 8 und swift 3. Können wir dieses Problem auf andere Weise beheben? –

+0

Ok, endlich funktioniert es! Der Fix ist unter den App-Transport- und Sicherheitseinstellungen, die Sie hinzufügen, erlaubt Arbitrary Loads und setzen Sie seinen Wert auf YES. Jetzt fügen Sie auch Ausnahme-Domains unter der ATS-Einstellung hinzu und darunter fügen Sie die Website hinzu, zum Beispiel hier ist es nytimes.com, und anstelle des Wörterbuchs legen Sie ihren Typ als String fest. Die NSExceptionAllowsinsecureHTTPLoads und NSIncludesSubdomains waren in meinem Fall nicht erforderlich. Ich hoffe, dies hilft jemandem, der auf dieses Problem stößt. Ich hätte gerne einen Screenshot gepostet, aber ich scheine es nicht zu tun. Und @Moxy vielen Dank, Ihre Antwort half sehr. –

+0

@JohnNapes Ich empfehle Ihnen, stattdessen zu posten und zu antworten, Kommentare sind vorübergehend. Wenn Ihnen die Antwort von SO-Benutzer Moxy hilft, ermutige ich Sie, seine Antwort zu akzeptieren und ihm eine positive Bewertung zu geben. –

Verwandte Themen