forked from shadowfacts/Tusker
Avoid loading cached data into memory when prefetching
This commit is contained in:
parent
2e88b266d9
commit
e7800249af
|
@ -51,13 +51,7 @@ class ImageCache {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
} else {
|
} else {
|
||||||
let group = RequestGroup(url: url) { (data, image) in
|
let group = createGroup(url: url)
|
||||||
if let data = data {
|
|
||||||
try? self.cache.set(key, data: data)
|
|
||||||
}
|
|
||||||
self.groups.removeValueWithoutReturning(forKey: url)
|
|
||||||
}
|
|
||||||
groups[url] = group
|
|
||||||
let request = group.addCallback(completion)
|
let request = group.addCallback(completion)
|
||||||
group.run()
|
group.run()
|
||||||
return request
|
return request
|
||||||
|
@ -65,6 +59,28 @@ class ImageCache {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func fetchIfNotCached(_ url: URL) {
|
||||||
|
// if caching is disabled, don't bother fetching since nothing will be done with the result
|
||||||
|
guard !ImageCache.disableCaching else { return }
|
||||||
|
|
||||||
|
if !((try? cache.has(url.absoluteString)) ?? false),
|
||||||
|
!groups.contains(key: url) {
|
||||||
|
let group = createGroup(url: url)
|
||||||
|
group.run()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func createGroup(url: URL) -> RequestGroup {
|
||||||
|
let group = RequestGroup(url: url) { (data, image) in
|
||||||
|
if let data = data {
|
||||||
|
try? self.cache.set(url.absoluteString, data: data)
|
||||||
|
}
|
||||||
|
self.groups.removeValueWithoutReturning(forKey: url)
|
||||||
|
}
|
||||||
|
groups[url] = group
|
||||||
|
return group
|
||||||
|
}
|
||||||
|
|
||||||
func getData(_ url: URL) -> Data? {
|
func getData(_ url: URL) -> Data? {
|
||||||
return try? cache.getData(url.absoluteString)
|
return try? cache.getData(url.absoluteString)
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,4 +47,12 @@ class MultiThreadDictionary<Key: Hashable, Value> {
|
||||||
}
|
}
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func contains(key: Key) -> Bool {
|
||||||
|
var value: Bool!
|
||||||
|
queue.sync {
|
||||||
|
value = dict.keys.contains(key)
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -213,7 +213,7 @@ extension NotificationsTableViewController: UITableViewDataSourcePrefetching {
|
||||||
func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {
|
func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {
|
||||||
for indexPath in indexPaths {
|
for indexPath in indexPaths {
|
||||||
for notification in item(for: indexPath).notifications {
|
for notification in item(for: indexPath).notifications {
|
||||||
_ = ImageCache.avatars.get(notification.account.avatar, completion: nil)
|
ImageCache.avatars.fetchIfNotCached(notification.account.avatar)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,9 +21,9 @@ extension StatusTablePrefetching {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for status in statuses {
|
for status in statuses {
|
||||||
_ = ImageCache.avatars.get(status.account.avatar, completion: nil)
|
ImageCache.avatars.fetchIfNotCached(status.account.avatar)
|
||||||
for attachment in status.attachments where attachment.kind == .image {
|
for attachment in status.attachments where attachment.kind == .image {
|
||||||
_ = ImageCache.attachments.get(attachment.url, completion: nil)
|
ImageCache.attachments.fetchIfNotCached(attachment.url)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue