Comments (5)
If I get it correctly you're implementing something that the library does anyway: Once an observable is dropped from memory, it releases all its observing functions (and other things that are retained by those). Calling unsubscribe is therefore not actually needed in almost all cases (so far I never used it myself, it was just integrated into the library because so many people asked for it - but basically you should never need it).
from interstellar.
Yes, this is the usecase that is handled by dispose-bags in other frameworks. I don't want to introduce this complicated concept into the library, that's why I'm looking for other ways.
Maybe it would make sense to change the implementation of ObserverToken
. It was implemented in the first place as an opaque thing to store until we come up with a better implementation. Maybe it's time to change it to a struct now and implement the unsubscribe
function directly on it.
from interstellar.
Type-erased version:
protocol AnyObservable: class {
func unsubscribe(_ token: ObserverToken)
}
extension Observable: AnyObservable {
}
final class Subscription {
private weak var observable: AnyObservable?
private let token: ObserverToken
init(observable: AnyObservable, token: ObserverToken) {
self.observable = observable
self.token = token
}
deinit {
observable?.unsubscribe(token)
}
}
extension ObserverToken {
func subscription<T>(from observable: Observable<T>) -> Subscription {
return Subscription(observable: observable, token: self)
}
}
from interstellar.
Thanks for the explanation, @JensRavens. You're right, and I am not worried about the Observable
being dropped from memory, nor about the Observer
being dropped either (since I can capture weakly in the observation closure).
The problem I'm trying to solve is what if you want to bind, then re-bind objects without them ever being deallocated? Take a UITableViewCell
as an example, since it's reused, and never deallocated.
final class Cell: UITableViewCell {
func bind(observable: Observable<String>) {
// Uh-oh .. need to unsubscribe from previous observable
// I need to retain the observables somehow then...
self.weakObservable.unsubscribe(self.token)
self.weakObservable = observable
self.token = observable.subscribe(...)
}
}
You see how this burden of maintaining two properties, and doing the unsubscribed dance would be required in this case, since both objects are still in-memory?
from interstellar.
@JensRavens I'm happy to raise a PR with that idea in mind if you're busy. I presume the only additional change would be to retain the observable weakly within the token for the unsubscribe to work without the need to pass in any additional parameter.
from interstellar.
Related Issues (20)
- Signal could be struct HOT 2
- Adding Signal update(f: T? -> T) HOT 5
- Interstellar 2.0 HOT 18
- Debounce using GCD? HOT 1
- Yosemite support HOT 5
- Memory leak when map'ing signals HOT 4
- More complex unsubscription in v2 HOT 5
- Possible data race in function `subscribe`
- Not sure about how `debounce` works HOT 2
- Swift 3 version HOT 2
- Missing comma in .podspec file
- Question regarding Thread class HOT 2
- global(qos:) only available on OSX 10.10 HOT 1
- Debounce doesn't deliver last call to update
- Feature Request: API for cancelling underlying async task HOT 5
- Using Queue with observable, maybe race condition? HOT 1
- Filter HOT 3
- Updating observable's value without triggering update HOT 1
- Swift's 5 Result type HOT 5
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from interstellar.