Commit 7ff43c41 by Demid Merzlyakov

NWSAlert ExtendedInfo caching.

parent b44973b5
......@@ -8,8 +8,33 @@
import Foundation
class NWSAlertInfoParser {
public func fetchExtendedInfo(for alert: NWSAlert, completion: @escaping (NWSAlertExtendedInfo?) -> ()) {
public func fetchExtendedInfo(for alert: NWSAlert, completion: @escaping (String?, NWSAlertExtendedInfo?) -> ()) {
let log = Logger(componentName: "NWSAlertInfoParser (alert \(alert.messageID))")
fetchContent(for: alert, logger: log) { [weak self] (weatherMessage) in
guard let weatherMessage = weatherMessage else {
completion(nil, nil)
return
}
guard let self = self else { return }
let extendedInfo: NWSAlertExtendedInfo = self.parseExtendedInfo(from: weatherMessage)
let debugEncoder = JSONEncoder()
debugEncoder.outputFormatting = .prettyPrinted
debugEncoder.dateEncodingStrategy = .iso8601
if let jsonData = try? debugEncoder.encode(extendedInfo), let json = String(data: jsonData, encoding: .utf8) {
log.debug("Parsed: \(json)")
}
completion(weatherMessage, extendedInfo)
}
}
// MARK: - Private methods
private func fetchContent(for alert: NWSAlert, logger log: Logger, completion: @escaping (String?) -> ()) {
guard alert.weatherMessage == nil else {
log.debug("Using previously fetched weatherMessage")
completion(alert.weatherMessage)
return
}
log.info("URL: \(alert.messageURL)")
guard let url = URL(string: alert.messageURL) else {
log.error("Bad URL")
......@@ -32,19 +57,10 @@ class NWSAlertInfoParser {
return
}
log.debug("Response: \(responseString)")
let extendedInfo: NWSAlertExtendedInfo = self.parseExtendedInfo(from: responseString)
let debugEncoder = JSONEncoder()
debugEncoder.outputFormatting = .prettyPrinted
debugEncoder.dateEncodingStrategy = .iso8601
if let jsonData = try? debugEncoder.encode(extendedInfo), let json = String(data: jsonData, encoding: .utf8) {
log.debug("Parsed: \(json)")
}
completion(extendedInfo)
completion(responseString)
}.resume()
}
// MARK: - Private methods
private static var dateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
// Date examples:
......
......@@ -161,15 +161,16 @@ public class NWSAlertsManager {
var newAlertsToFetch = [NWSAlert]()
let parser = NWSAlertInfoParser()
for alert in alerts {
for alert in alerts.filter({ $0.extendedInfo == nil }) {
if !self.extendedInfoBeingFetched.contains(alert) {
self.extendedInfoBeingFetched.insert(alert)
parser.fetchExtendedInfo(for: alert) { [weak self] (extendedInfo) in
parser.fetchExtendedInfo(for: alert) { [weak self] (weatherMessage, extendedInfo) in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
guard let alertIndex = self.alerts.firstIndex(where: { $0 == alert }) else {
return
}
self.alerts[alertIndex].weatherMessage = weatherMessage
self.alerts[alertIndex].extendedInfo = extendedInfo
self.internalQueue.addOperation {
self.extendedInfoBeingFetched.remove(alert)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment