使用@escaping 闭包时创建 Observable 的问题
Problems with creating Observable when using @escaping closures
我正在尝试为 NSManagedObjectContext
save()
操作编写一个可观察对象,但没有成功。该函数既不触发 onNext
也不触发 onCompleted
事件,并立即处理。当我使用断点进行调试时,它显示 Disposables.create()
和 @escaping
通知关闭在不同的线程上工作。请告诉我在下面的代码中做错了什么,并帮助解决问题。
func save() -> Observable<Void> {
guard base.hasChanges else { return Observable.just(()) }
return Observable.create { observer -> Disposable in
var token: NSObjectProtocol?
token = NotificationCenter.default.addObserver(forName: .NSManagedObjectContextObjectsDidChange, object: self, queue: nil) { _ in
observer.onNext(()) /* Is executed on the other thread and is never called */
observer.onCompleted()
NotificationCenter.default.removeObserver(token!)
}
base.perform {
do {
try base.save()
} catch {
observer.onError(Error.some)
}
}
return Disposables.create() \* Immediately calls this func *\
}
}
在我看来这应该可行:
func save() -> Observable<Void> {
Observable.create { observer in
base.perform {
do {
try base.save()
observer.onNext(())
observer.onCompleted()
}
catch {
observer.onError(error)
}
}
return Disposables.create()
}
}
func save() -> Observable<Void> {
guard base.hasChanges else { return Observable.just(()) }
return Observable.create { observer -> Disposable in
let queue = DispatchQueue(label: "Save")
queue.sync {
self.base.perform {
do {
try self.base.save()
observer.onNext(())
observer.onCompleted()
} catch {
observer.onError(NSManagedObjectContext.ReactiveError.save)
}
}
}
return Disposables.create()
}
}
我正在尝试为 NSManagedObjectContext
save()
操作编写一个可观察对象,但没有成功。该函数既不触发 onNext
也不触发 onCompleted
事件,并立即处理。当我使用断点进行调试时,它显示 Disposables.create()
和 @escaping
通知关闭在不同的线程上工作。请告诉我在下面的代码中做错了什么,并帮助解决问题。
func save() -> Observable<Void> {
guard base.hasChanges else { return Observable.just(()) }
return Observable.create { observer -> Disposable in
var token: NSObjectProtocol?
token = NotificationCenter.default.addObserver(forName: .NSManagedObjectContextObjectsDidChange, object: self, queue: nil) { _ in
observer.onNext(()) /* Is executed on the other thread and is never called */
observer.onCompleted()
NotificationCenter.default.removeObserver(token!)
}
base.perform {
do {
try base.save()
} catch {
observer.onError(Error.some)
}
}
return Disposables.create() \* Immediately calls this func *\
}
}
在我看来这应该可行:
func save() -> Observable<Void> {
Observable.create { observer in
base.perform {
do {
try base.save()
observer.onNext(())
observer.onCompleted()
}
catch {
observer.onError(error)
}
}
return Disposables.create()
}
}
func save() -> Observable<Void> {
guard base.hasChanges else { return Observable.just(()) }
return Observable.create { observer -> Disposable in
let queue = DispatchQueue(label: "Save")
queue.sync {
self.base.perform {
do {
try self.base.save()
observer.onNext(())
observer.onCompleted()
} catch {
observer.onError(NSManagedObjectContext.ReactiveError.save)
}
}
}
return Disposables.create()
}
}