// // FeedListFeed.swift // Evergreen // // Created by Brent Simmons on 11/4/17. // Copyright © 2017 Ranchero Software. All rights reserved. // import Foundation import RSCore import RSParser import RSWeb extension Notification.Name { public static let FeedListFeedDidBecomeAvailable = Notification.Name(rawValue: "FeedListFeedDidBecomeAvailable") } final class FeedListFeed: Hashable, DisplayNameProvider { let name: String let url: String let homePageURL: String let hashValue: Int var lastDownloadAttemptDate: Date? = nil var parsedFeed: ParsedFeed? = nil { didSet { postFeedListFeedDidBecomeAvailableNotification() } } var nameForDisplay: String { // DisplayNameProvider get { return name } } init(name: String, url: String, homePageURL: String) { self.name = name self.url = url self.homePageURL = homePageURL self.hashValue = url.hashValue } private struct Key { static let name = "name" static let editedName = "editedName" // Used in DefaultFeeds.plist static let url = "url" static let homePageURL = "homePageURL" } convenience init(dictionary: [String: String]) { let name = (dictionary[Key.name] ?? dictionary[Key.editedName])! let url = dictionary[Key.url]! let homePageURL = dictionary[Key.homePageURL]! self.init(name: name, url: url, homePageURL: homePageURL) } func downloadIfNeeded() { guard let lastDownloadAttemptDate = lastDownloadAttemptDate else { downloadFeed() return } let cutoffDate = Date().addingTimeInterval(-(30 * 60)) // 30 minutes in the past if lastDownloadAttemptDate < cutoffDate { downloadFeed() } } static func ==(lhs: FeedListFeed, rhs: FeedListFeed) -> Bool { return lhs.hashValue == rhs.hashValue && lhs.url == rhs.url && lhs.name == rhs.name && lhs.homePageURL == rhs.homePageURL } } private extension FeedListFeed { func postFeedListFeedDidBecomeAvailableNotification() { NotificationCenter.default.post(name: .FeedListFeedDidBecomeAvailable, object: self, userInfo: nil) } func downloadFeed() { lastDownloadAttemptDate = Date() guard let feedURL = URL(string: url) else { return } downloadUsingCache(feedURL) { (data, response, error) in guard let data = data, error == nil else { return } let parserData = ParserData(url: self.url, data: data) FeedParser.parse(parserData) { (parsedFeed, error) in if let parsedFeed = parsedFeed, parsedFeed.items.count > 0 { self.parsedFeed = parsedFeed } } } } }