Ios 反作用可可问题
我试图在我的项目中使用ReactiveCocoa来处理UITableView的填充 如果没有可用的数据,则加载数据时,我希望将Ios 反作用可可问题,ios,swift,reactive-cocoa,Ios,Swift,Reactive Cocoa,我试图在我的项目中使用ReactiveCocoa来处理UITableView的填充 如果没有可用的数据,则加载数据时,我希望将tableView.backgroundView的hidden属性设置为false。以下是我目前掌握的情况: func loadData() { let dataSource = tableView.dataSource as! BlockedTableViewDataSource let load = dataSource.load(currentUse
tableView.backgroundView
的hidden
属性设置为false。以下是我目前掌握的情况:
func loadData() {
let dataSource = tableView.dataSource as! BlockedTableViewDataSource
let load = dataSource.load(currentUser) # RACSignal
load.map {
return ($0 as! [AnyObject]).count > 0
}.startWith(true).distinctUntilChanged().setKeyPath("hidden", onObject: tableView.backgroundView!)
load.subscribeError({ error in
println(error)
}, completed: {
self.tableView.reloadData()
self.refreshControl?.endRefreshing()
})
}
然而,这个错误指出我需要等待网络请求完成。我正在使用Parse获取数据,但我认为我的ReactiveCocoa代码设置不正确,导致了这个错误。如果我注释掉
load.map…
部分,表将按预期填充
如何以“反应式”的方式实施这一点
更新#1
下面是数据源的load
函数
func load(user: User) -> RACSignal {
return self.getBlocks(user).doNext {
self.blocks = $0 as! [Block]
}
}
private func getBlocks(fromUser: User) -> RACSignal {
let query = Block.query()!
query.whereKey("fromUser", equalTo: fromUser)
query.includeKey("toUser")
return query.rac_findObjects()
}
更新#2
方法
rac\u findObjects()
返回一个值。这意味着,每当有人订阅此信号时,其副作用(即执行底层网络请求)将重复出现。似乎是PFQuery
,因此出现了错误消息
在本例中,您为load
信号订阅了两个,因为调用setKeyPath
也会创建一个订阅。因此,网络请求会执行两次,这会导致您发布的错误
正如链接的GitHub问题中所建议的,您可以使用RACMulticastConnection
来确保副作用(网络请求)只执行一次,而不管有多少订阅者。例如:
let load = dataSource.load(currentUser).publish().autoconnect()
我们可以看到
数据源。加载代码吗?@lightice11我添加了加载(以及getBlocks
,因为加载数据
并不是那么有趣)。“但是,这个错误说明我需要等待网络请求完成。”看起来有点不清楚,“这个错误”是什么意思?@MichałCiuba更新了w/错误,尽管它发生在解析框架的最底层。我觉得这就是我如何设置startWith(true).distinctUntilChanged().se…
部分的原因,因为如果我注释掉了tableView加载的那部分(尽管我没有得到背景视图的显示/隐藏)。哇,我永远也想不到这一点。非常感谢您的深入解释!
let load = dataSource.load(currentUser).publish().autoconnect()