我在编译代码时遇到错误:
没有更多上下文,表达类型不明确
有趣的是它在另一台机器上工作。我看到了一些关于此错误的其他帖子,但不同的情况或答案只是我已经尝试过的一些通用内容(清除缓存、重新启动、重新安装 Pod)。
我有 Xcode 13.4.1。
private var deleteDisposable: Disposable?
func startDeleting() {
deleteDisposable = Observable<Int> // error message pointing on equal sign
.interval(.seconds(60), scheduler: Schedulers.serialBackground)
.map { [weak self] _ in self?.dao.count() ?? 0 }
.flatMap { [weak self] number in
if number! <= 10 {
return self?.deleteOld() ?? Completable.empty()
} else {
return self?.delete() ?? Completable.empty()
}
}
.subscribe(on: Schedulers.concurrentBackground)
.observe(on: Schedulers.serialBackground)
.subscribe()
deleteDisposable?.disposed(by: disposeBag)
}
Run Code Online (Sandbox Code Playgroud)
当我摆脱if语句块时,它工作得很好。
我究竟做错了什么?
@编辑
其主体deleteOld()和delete()方法类似:
func delete() -> Completable {
Completable.create { [weak self] observer in
self?.firstDao.delete()
self?.secondDao.delete()
observer(.completed)
return Disposables.create()
}
}
Run Code Online (Sandbox Code Playgroud)
我看到 Louis Lac 已经在评论中回答了这个问题。一般来说,每当你看到Type of expression is ambiguous without more contextIt 时,就意味着你的类型错误,或者系统无法推断出某物的类型。答案始终是添加所有内容的类型。
要回答评论中的问题...在 flatMap 中,最好不要引用 self ,但如果必须引用它,请使用weak或unowned。这是因为 Observable 链持有对您在闭包中使用的任何内容的引用,并且 dispose bag 持有对 observable 链的引用,并且您的类对象持有对 dispose bag 的引用......因此,如果您self强,你的类将持有对其自身的引用,因此永远不会删除。
代码的一些其他问题...
subscribe(on:)。由于您将serialBackground调度程序传递给了间隔,因此它将发送到该线程中。observe(on:)。由于它.subscribe()是空的,因此没有代码可以在serialBackground调度程序上运行。dispose()会deleteDisposable关闭删除系统。deleteDisposable,您应该处理掉其中可能存在的任何内容。deleteDisposable?.dispose()。否则,您将运行多个计时器。dao,如果 的计数dao是从不同的线程更改的,那么您可能已经在闭包中设置了竞争条件map。传递给的闭包map必须是纯粹的。最后,您是否知道当应用程序在后台时计时器会暂停运行?