Skip to content

Commit b0a3b3d

Browse files
authored
Merge pull request #176 from ReactiveCocoa/binding-limit-memory-growth
Fixed the unbound memory growth of unidirectional bindings.
2 parents 228407f + 5d47feb commit b0a3b3d

File tree

2 files changed

+19
-20
lines changed

2 files changed

+19
-20
lines changed

Sources/Property.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ public protocol PropertyProtocol: class, BindingSourceProtocol {
3232

3333
extension PropertyProtocol {
3434
@discardableResult
35-
public func observe(_ observer: Observer<Value, NoError>) -> Disposable? {
36-
return producer.observe(observer)
35+
public func observe(_ observer: Observer<Value, NoError>, during lifetime: Lifetime) -> Disposable? {
36+
return producer.observe(observer, during: lifetime)
3737
}
3838
}
3939

Sources/UnidirectionalBinding.swift

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,29 @@ infix operator <~ : BindingPrecedence
1515
public protocol BindingSourceProtocol {
1616
associatedtype Value
1717
associatedtype Error: Swift.Error
18-
18+
1919
/// Observe the binding source by sending any events to the given observer.
2020
@discardableResult
21-
func observe(_ observer: Observer<Value, Error>) -> Disposable?
21+
func observe(_ observer: Observer<Value, Error>, during lifetime: Lifetime) -> Disposable?
2222
}
2323

24-
extension Signal: BindingSourceProtocol { }
24+
extension Signal: BindingSourceProtocol {
25+
@discardableResult
26+
public func observe(_ observer: Observer, during lifetime: Lifetime) -> Disposable? {
27+
return self.take(during: lifetime).observe(observer)
28+
}
29+
}
2530

2631
extension SignalProducer: BindingSourceProtocol {
2732
@discardableResult
28-
public func observe(_ observer: Observer<Value, Error>) -> Disposable? {
33+
public func observe(_ observer: ProducedSignal.Observer, during lifetime: Lifetime) -> Disposable? {
2934
var disposable: Disposable!
3035

31-
startWithSignal { signal, signalDisposable in
32-
disposable = signalDisposable
33-
signal.observe(observer)
36+
self
37+
.take(during: lifetime)
38+
.startWithSignal { signal, signalDisposable in
39+
disposable = signalDisposable
40+
signal.observe(observer)
3441
}
3542

3643
return disposable
@@ -93,12 +100,8 @@ public func <~
93100
} else {
94101
observer = Observer(value: { [weak target] in target?.consume($0) })
95102
}
96-
97-
let disposable = source.observe(observer)
98-
if let disposable = disposable {
99-
target.lifetime.ended.observeCompleted { disposable.dispose() }
100-
}
101-
return disposable
103+
104+
return source.observe(observer, during: target.lifetime)
102105
}
103106

104107
/// Binds a source to a target, updating the target's value to the latest
@@ -146,11 +149,7 @@ public func <~
146149
observer = Observer(value: { [weak target] in target?.consume(Target.Value(reconstructing: $0)) })
147150
}
148151

149-
let disposable = source.observe(observer)
150-
if let disposable = disposable {
151-
target.lifetime.ended.observeCompleted { disposable.dispose() }
152-
}
153-
return disposable
152+
return source.observe(observer, during: target.lifetime)
154153
}
155154

156155
/// A binding target that can be used with the `<~` operator.

0 commit comments

Comments
 (0)