Skip to content

Commit ec53231

Browse files
authored
Merge pull request #63 from heroesofcode/feature/improvements-v2.0.0
Improvements v2.0.0
2 parents b9774a7 + ac26e09 commit ec53231

File tree

7 files changed

+38
-24
lines changed

7 files changed

+38
-24
lines changed

Example/Arena-Playground/Content.playground/Contents.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ var getName = ""
1818

1919
let viewModel = ViewModel()
2020

21-
viewModel.myName.observer(viewModel) { name in
21+
viewModel.myName.addObserver(viewModel) { name in
2222
getName = name
2323
}
2424

Example/Arena-Playground/PlaygroundDependencies/Package.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ let package = Package(
2323
)
2424

2525
package.dependencies = [
26-
.package(url: "https://github.com/heroesofcode/DataLife", from: "1.5.0")
26+
.package(url: "https://github.com/heroesofcode/DataLife", branch: "master")
2727
]
2828
package.targets = [
2929
.target(name: "PlaygroundDependencies",
@@ -37,4 +37,4 @@ package.platforms = [
3737
.macOS("10.13"),
3838
.tvOS("12.0"),
3939
.watchOS("4.0")
40-
]
40+
]

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ final class ViewController: UIViewController {
5252
}
5353

5454
private func setupState() {
55-
viewModel.myName.observer(viewModel) { [weak self] name in
55+
viewModel.myName.addObserver(viewModel) { [weak self] name in
5656
self?.nameLabel.text = name
5757
}
5858
}

Sources/DataLife/DataLife.swift

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,42 @@
1-
public class DataLife<T> {
2-
3-
public typealias CompletionHandler = ((T) -> Void)
1+
import Foundation
42

3+
public class DataLife<T> {
4+
5+
public typealias CompletionHandler = (T) -> Void
6+
57
public var value: T? {
68
didSet {
7-
self.notifyObservers(self.observers)
9+
notifyObservers()
810
}
911
}
10-
11-
private var observers: [Int: CompletionHandler] = [:]
12-
12+
13+
private var observers: [UUID: CompletionHandler] = [:]
14+
private let queue = DispatchQueue(label: "com.myproject.datalife.queue", attributes: .concurrent)
15+
1316
public init() {}
14-
15-
public func observer(_ observer: ObserverProtocol, completion: @escaping CompletionHandler) {
16-
self.observers[observer.id] = completion
17+
18+
public func addObserver(_ observer: ObserverProtocol, completion: @escaping CompletionHandler) {
19+
let id = UUID()
20+
21+
queue.async(flags: .barrier) {
22+
self.observers[id] = completion
23+
}
1724
}
1825

19-
private func notifyObservers(_ observers: [Int: CompletionHandler]) {
20-
if value != nil {
21-
guard let value = value else { return }
22-
observers.forEach({ $0.value(value) })
26+
public func removeObserver(_ observer: ObserverProtocol) {
27+
queue.async(flags: .barrier) {
28+
self.observers.removeValue(forKey: observer.id)
2329
}
2430
}
25-
31+
32+
private func notifyObservers() {
33+
guard let value = value else { return }
34+
35+
queue.sync {
36+
self.observers.forEach { $0.value(value) }
37+
}
38+
}
39+
2640
deinit {
2741
observers.removeAll()
2842
}

Sources/DataLife/DataLifeViewModel.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import Foundation
22

33
open class DataLifeViewModel: ObserverProtocol {
44
public init() {}
5-
6-
public var id: Int = 0
5+
6+
public var id: UUID = UUID()
77
public func onValueChanged(_ value: Any?) {}
88
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Foundation
22

3-
public protocol ObserverProtocol {
4-
var id : Int { get set }
3+
public protocol ObserverProtocol: AnyObject {
4+
var id: UUID { get set }
55
func onValueChanged(_ value: Any?)
66
}

Tests/DataLifeTests/DataLifeTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ final class DataLifeTests: XCTestCase {
88

99
let viewModel = ViewModel()
1010

11-
viewModel.myName.observer(viewModel) { name in
11+
viewModel.myName.addObserver(viewModel) { name in
1212
getName = name
1313
}
1414

0 commit comments

Comments
 (0)