Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 反作用可可问题_Ios_Swift_Reactive Cocoa - Fatal编程技术网

Ios 反作用可可问题

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

我试图在我的项目中使用ReactiveCocoa来处理UITableView的填充

如果没有可用的数据,则加载数据时,我希望将
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()