mirror of
https://github.com/Ranchero-Software/NetNewsWire
synced 2025-08-12 06:26:36 +00:00
Add a cache to HTMLMetadataDownloader; do all parsing off the main thread, for better UI performance. Also: make FaviconURLFinder use HTMLMetadataDownloader, as it should have in the first place.
This commit is contained in:
@@ -12,6 +12,9 @@ import RSParser
|
||||
|
||||
struct HTMLMetadataDownloader {
|
||||
|
||||
static var metadataCache = [String: RSHTMLMetadata]()
|
||||
static let serialDispatchQueue = DispatchQueue(label: "HTMLMetadataDownloader")
|
||||
|
||||
static func downloadMetadata(for url: String, _ callback: @escaping (RSHTMLMetadata?) -> Void) {
|
||||
|
||||
guard let actualURL = URL(string: url) else {
|
||||
@@ -25,8 +28,7 @@ struct HTMLMetadataDownloader {
|
||||
|
||||
let urlToUse = response.url ?? actualURL
|
||||
let parserData = ParserData(url: urlToUse.absoluteString, data: data)
|
||||
let metadata = RSHTMLMetadataParser.htmlMetadata(with: parserData)
|
||||
callback(metadata)
|
||||
parseMetadata(with: parserData, callback)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -37,4 +39,27 @@ struct HTMLMetadataDownloader {
|
||||
callback(nil)
|
||||
}
|
||||
}
|
||||
|
||||
private static func parseMetadata(with parserData: ParserData, _ callback: @escaping (RSHTMLMetadata?) -> Void) {
|
||||
|
||||
serialDispatchQueue.async {
|
||||
|
||||
let md5String = (parserData.data as NSData).rs_md5HashString()
|
||||
if let md5String = md5String, let cachedMetadata = metadataCache[md5String] {
|
||||
DispatchQueue.main.async {
|
||||
callback(cachedMetadata)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
let htmlMetadata = RSHTMLMetadataParser.htmlMetadata(with: parserData)
|
||||
if let md5String = md5String {
|
||||
metadataCache[md5String] = htmlMetadata
|
||||
}
|
||||
|
||||
DispatchQueue.main.async {
|
||||
callback(htmlMetadata)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user