2017-01-27 11 views
2

Я новичок в iOS. Я пытался создать простой rss-ридер, используя MWFeedParser. Я не получаю ошибку сборки, симулятор всплывает хорошо, но тогда симулятор не отображает RSS-каналы, но только пустой tableView. Я не могу придумать, что случилось. Любая помощь будет очень оценена. Благодарю.Я не знаю, что не так с моим кодом (rss reader с 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

Не уверен, как работает эта библиотека, но, вероятно, ничего не держит в руках ваш feedparser, и он освобождается сразу после запуска запроса. Попробуйте использовать свойство, чтобы у вас была сильная ссылка на парсер. – Moxy

+0

@Moxy Спасибо, что нашли время ответить. Я полностью основал эту программу на учебнике [https://www.youtube.com/watch?v=jootsUaCvAU], но выполнил его. Не могли бы вы помочь в разработке свойств, содержащих ссылки. Еще раз спасибо. –

ответ

0

На самом деле вы код не работает, потому что вы не уважаете ATS. Другими словами, ваш канал находится в HTTP, а не в HTTPS.

Вы должны увидеть следующее сообщение, если открыть консоль

App транспортная безопасность заблокировала читаемую HTTP (HTTP: //) нагрузка ресурса, так как это небезопасно. Временные исключения могут быть настроены через файл Info.plist вашего приложения.

Вы можете решить эту проблему, установив исключение в вашем info.plist

info.plist screenshot

Но учтите, что компания Apple не будет принимать исключения ATS в ближайшем будущем.

+0

Благодарим вас за помощь. Вы были абсолютно правы в ошибке ATS, я получаю точно такую ​​же печать на моей консоли. Я сделал все изменения, как вы предполагали, но это не исправить. Я все еще получаю ту же ошибку ATS. Я очистил проект и снова запустил его. Я даже попробовал «AllowsArbitraryLoads» в ATSS и установил его в «YES», но это все равно не помогло. Я не уверен, что я делаю неправильно. Я пробовал переписывать, поскольку вы снова показываете, но я не знаю, что это не работает. В случае, если это важно, я использую Xcode 8 и swift 3. Какие-либо другие способы решения этой проблемы? –

+0

Хорошо, я, наконец, получил его! Исправление находится в разделе «Параметры транспорта и безопасности приложения», которые вы добавляете «Разрешить произвольные нагрузки», и установите для него значение «ДА». Теперь также добавьте домены исключений в настройках ATS и под ним добавьте сайт, например здесь это nytimes.com, а вместо словаря установите свой тип как String. В моем случае не нужны NSExceptionAllowsinsecureHTTPLoads и NSIncludesSubdomains. Надеюсь, это поможет кому-то, кто сталкивается с этой проблемой. Мне бы хотелось опубликовать снимок экрана, но, похоже, я не могу этого сделать. И @Moxy спасибо вам большое, ваш ответ помог много. –

+0

@JohnNapes Я рекомендую вам отправлять и отвечать вместо этого, комментарии являются временными. Если ответ, предоставленный пользователем SO Moxy, поможет вам, я рекомендую вам принять его ответ и дать ему преимущество. –