Stores now have listeners as a part of their design (ref #855 review) (#878)

Listeners are a built in part of the design of `Store` protocol.
Removed special-case code from the `BookmarkStore`.
This commit is contained in:
Hesham Salman
2017-11-07 08:47:25 -05:00
committed by Ryan Nystrom
parent 7c23286628
commit 0bc9fe42c3
4 changed files with 26 additions and 23 deletions

View File

@@ -16,15 +16,7 @@ final class BookmarkStore: Store {
typealias Model = Bookmark
private class ListenerWrapper {
weak var listener: BookmarkListener?
init(listener: BookmarkListener) {
self.listener = listener
}
}
private var listeners: [ListenerWrapper] = []
var listeners: [ListenerWrapper] = []
private let _key = "com.freetime.BookmarkStore.bookmark"
var key: String {
@@ -49,15 +41,4 @@ final class BookmarkStore: Store {
self.values = array
}
func add(listener: BookmarkListener) {
let wrapper = ListenerWrapper(listener: listener)
listeners.append(wrapper)
}
func save() {
guard let data = try? encoder.encode(values) else { return }
defaults.set(data, forKey: key)
listeners.forEach { $0.listener?.didUpdateBookmarks() }
}
}

View File

@@ -15,7 +15,7 @@ class BookmarkViewController: UIViewController,
PrimaryViewController,
UISearchBarDelegate,
BookmarkHeaderSectionControllerDelegate,
BookmarkListener,
StoreListener,
BookmarkSectionControllerDelegate,
InitialEmptyViewDelegate,
TabNavRootViewControllerType {
@@ -295,9 +295,9 @@ TabNavRootViewControllerType {
searchBar.becomeFirstResponder()
}
// MARK: BookmarkListener
// MARK: StoreListener
func didUpdateBookmarks() {
func didUpdateStore() {
update(animated: true)
}

View File

@@ -9,12 +9,14 @@
import Foundation
class SearchRecentStore: Store {
typealias Model = SearchQuery
let key = "com.freetime.SearchRecentStore.results"
let defaults = UserDefaults.standard
var values: [SearchQuery]
var listeners: [ListenerWrapper] = []
let encoder = JSONEncoder()
let decoder = JSONDecoder()

View File

@@ -8,6 +8,18 @@
import Foundation
protocol StoreListener: class {
func didUpdateStore()
}
class ListenerWrapper {
weak var listener: StoreListener?
init(listener: StoreListener) {
self.listener = listener
}
}
protocol Store: AnyObject {
associatedtype Model: Codable, Equatable
@@ -18,8 +30,10 @@ protocol Store: AnyObject {
var decoder: JSONDecoder { get }
var values: [Model] { get set }
var listeners: [ListenerWrapper] { get set }
func add(_ value: Model)
func add(listener: StoreListener)
func remove(_ value: Model)
func clear()
@@ -34,6 +48,11 @@ extension Store {
save()
}
func add(listener: StoreListener) {
let wrapper = ListenerWrapper(listener: listener)
listeners.append(wrapper)
}
func remove(_ value: Model) {
guard let offset = values.index(of: value) else { return }
let index = values.startIndex.distance(to: offset)
@@ -49,6 +68,7 @@ extension Store {
func save() {
guard let data = try? encoder.encode(values) else { return }
defaults.set(data, forKey: key)
listeners.forEach { $0.listener?.didUpdateStore() }
}
func contains(_ value: Model) -> Bool {