我正在使用RxSwift 2.0.0-beta
如何以拉链方式组合2个不同类型的可观察对象?
// This works
[just(1), just(1)].zip { intElements in
return intElements.count
}
// This doesn't
[just(1), just("one")].zip { differentTypeElements in
return differentTypeElements.count
}
Run Code Online (Sandbox Code Playgroud)
我目前的解决方法是将所有内容映射到组合类型的可选元组,然后将可选元组拉到非可选元组中.
let intObs = just(1)
.map { int -> (int: Int?, string: String?) in
return (int: int, string: nil)
}
let stringObs = just("string")
.map { string -> (int: Int?, string: String?) in
return (int: nil, string: string)
}
[intObs, stringObs].zip { (optionalPairs) -> (int: Int, string: String) in
return (int: optionalPairs[0].int!, string: optionalPairs[1].string!)
} …Run Code Online (Sandbox Code Playgroud) 我目前正在使用Moya来发出我的网络请求.我已经从其中一个示例项目实现了以下内容@ https://github.com/DroidsOnRoids/RxSwiftExamples#tutorials
下面我设置了restaurantSearch,这样当有人输入文本时,它会发出新的请求.
var restaurantSearch: Observable<(String)> {
return searchBar
.rx_text
.throttle(0.5, scheduler: MainScheduler.instance)
.distinctUntilChanged()
}
Run Code Online (Sandbox Code Playgroud)
我有一个方法返回类型[餐厅]的观察
func restaurants() -> Observable<[Restaurant]> {
return restaurantSearch
.observeOn(MainScheduler.instance)
.flatMapLatest { postcode -> Observable<[Restaurant]?> in
return self.getRestaurants(postcode, cuisine: "", restaurantName: "")
}.replaceNilWith([])
}
internal func getRestaurants(postcode: String, cuisine: String, restaurantName: String) -> Observable<[Restaurant]?> {
return self.justEatProvider
.request(.Restaurant(postcode, cuisine, restaurantName))
.debug()
.mapArrayOptional(Restaurant.self, keyPath: "Restaurants")
}
Run Code Online (Sandbox Code Playgroud)
我正在调用此方法并将其绑定到tableView,如下所示:
func setupRx() {
api = JustEatApi(provider: provider, restaurantSearch: restaurantSearch)
api
.restaurants()
.bindTo(tableView.rx_itemsWithCellIdentifier("RestaurantTableViewCell", cellType: RestaurantTableViewCell.self)) { (row, element, cell) in
cell.restaurant …Run Code Online (Sandbox Code Playgroud) 我有一个array(Observable<[_]>),它是tableview的数据源.我希望能够向它添加新元素,并在每次将新元素附加到数组时更新tableview.我找不到如何添加新元素Observable<[_]>.
我需要使用RxSwift选择集合视图中特定索引处的项目.此方法无法正常工作.
collectionView.rx.modelSelected(SearchResult.self).subscribe(onNext:{ menuItem in }).addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
我想将以下代码转换为RxSwift. 还请帮助我如何Action在RxSwift.
ReactiveCocoa或者RxSwift哪个更适合在 swift3 中使用?
func tableView(_ tableView: UITableView, numberOfRowsInSection section:
Int) -> Int {
return posts.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath:
IndexPath) -> UITableViewCell {
let cell: BTSTableViewCell = self.tableView.dequeueReusableCell(withIdentifier: "BTSTableViewCellIdentifier")! as! BTSTableViewCell
cell.configureWithPost(posts[indexPath.row])
cell.delegate = self
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
// 259.5+ labelHeight+ bigImageHeight
let postViewModel = posts[indexPath.row]
//caption height
var captionHeight = postViewModel.textDetail?.height(withConstrainedWidth: tableView.bounds.size.width - 20, font: …Run Code Online (Sandbox Code Playgroud) 我有以下属性结构 Chat
struct Chat {
var id = String()
var gender = String()
var date = Date()
init() {}
}
Run Code Online (Sandbox Code Playgroud)
在视图控制器中,我声明了一个名为Chat的实例observablechat,然后我使用flatmap运算符来尝试并观察date属性的变化observablechat.但是,如果我更改性别属性(如图所示),则会触发订阅.我想知道为什么会这样,我如何修复此代码,以便订阅只查看date属性发生了什么,没有别的?
class ViewController: UIViewController {
var observablechat = Variable(Chat())
observablechat.asObservable()
.flatMap { (Chat) -> Observable<Date> in
return Observable.of(Chat.matchDate)
}.subscribe(onNext: { (r) in
print(r)
}).addDisposableTo(disposeBag)
self.observablechat.value.gender = "male"
//triggers subscription above.
}
}
Run Code Online (Sandbox Code Playgroud) 要RxSwift在Swift 2中创建一个可观察的数组,我用它来做:
[1, 2, 3].toObservable().subscribeNext { print($0) }
Run Code Online (Sandbox Code Playgroud)
但是在Swift 3中,它不再起作用了,我收到了这个错误:
类型'[Int]'的值没有成员'toObservable'
如何RxSwift从swift数组创建一个可观察的数组?
我的项目中有两个框架,每个框架都依赖于同一个 Swift 包(在本例中为 RxSwift,但我认为这并不重要)。
为了构建项目,我必须在两个目标中包含相同的包(通过目标常规设置中的“框架和库”列表) - 否则当我尝试导入包时,它找不到它。
当我运行我的应用程序时,我在控制台中看到如下警告:
objc[79287]: Class _TtC9Alamofire18UploadTaskDelegate is implemented in both
/Users/deanWombourne/Desktop/PackageManagerTest/DerivedData/PackageManagerTest/
Build/Products/Debug-iphonesimulator/Framework1.framework/Framework1 (0x110877e00)
and
/Users/deanWombourne/Library/Developer/CoreSimulator/Devices/2319A320-1A01-4784-B85E-272FF0F999CB/
data/Containers/Bundle/Application/D40DE3EA-DD78-4241-B307-070CDAF8BFA1/PackageManagerTest.app/PackageManagerTest (0x10f9858c8).
One of the two will be used. Which one is undefined.
Run Code Online (Sandbox Code Playgroud)
有时,应用程序会在重复的包中崩溃。
我已经通过构建一个没有重复包问题的版本来测试该应用程序(将所有代码复制/粘贴到同一个目标!)然后它运行良好,所以这与重复包问题有关。
那么,我的问题是什么?
在 Xcode 中有什么方法可以指定一个包将包含在两个目标中,而不是将它复制两次到可执行文件中?
理想情况下,我想将它指定为某种动态库,这样它就不会被嵌入到可执行文件中,而是按需加载 - 但此时欢迎任何解决方案!
编辑
如果我只有一个框架,但它与主应用程序目标共享 RxSwift 包依赖项,我也会遇到此问题。
我正在尝试进行多个 API 调用并填充 Realm 数据库。一切正常。但是,当我尝试performSegue()在subscribe()方法上运行时,会引发异常,通知我无法在后台线程上执行此操作,这是完全合理的。
但是既然我订阅了MainScheduler.instance该subscribe()方法不应该在 UI 线程上运行吗?
Single.zip(APIClient.shared.getSchools(), APIClient.shared.getPointsOfInterest())
.observeOn(SerialDispatchQueueScheduler(qos: .background))
.flatMap { zip in return Single.zip(SchoolDao.shared.insertSchools(schoolsJson: zip.0), PointOfInterestDao.shared.insertPointsOfInterest(poisJson: zip.1))}
.flatMap{ _ in Single.zip(SchoolDao.shared.countSchools(), PointOfInterestDao.shared.countPointsOfInterest())}
.subscribeOn(MainScheduler.instance)
.subscribe(onSuccess: { tableCounts in
let (schoolsCount, poisCount) = tableCounts
if(schoolsCount != 0 && poisCount != 0){
print(Thread.isMainThread) //Prints False
self.performSegue(withIdentifier: "splashToLogin", sender: nil)
}
}, onError: {
error in return
}).disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)
我是否对 RXSwift 的工作原理做出了错误的假设?
编辑:如果我在订阅方法在主线程上运行.observeOn(MainScheduler.instance)后添加这一行.subscribeOn(MainScheduler.instance)。这是正确的行为吗?什么是.subscribeOn(MainScheduler.instance)即使在做什么?
我目前正在学习 RxSwift。
你什么时候用.drive(something),什么时候用.bind(to: something)?
例子:
let disposeBag = DisposeBag()
let isEnabled = BehaviorRelay(value: true)
let button = UIButton()
// what is the benefit of this:
isEnabled.asDriver().drive(button.rx.isEnabled).disposed(by: disposeBag)
// over this:
isEnabled.bind(to: button.rx.isEnabled).disposed(by: disposeBag)
// or is the above better?
Run Code Online (Sandbox Code Playgroud)
使用 RxSwift、驱动程序和绑定到的答案并没有真正的帮助。我不明白为什么添加asDriver()甚至有必要使它成为一个不会失败的东西。