mirror of
https://github.com/zhigang1992/GitHawk.git
synced 2026-04-24 12:15:10 +08:00
Listeners are a built in part of the design of `Store` protocol. Removed special-case code from the `BookmarkStore`.
This commit is contained in:
committed by
Ryan Nystrom
parent
7c23286628
commit
0bc9fe42c3
@@ -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() }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user