标签: rx-swift

RxSwift:使用Zip与不同类型的可观察对象

我正在使用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)

swift rx-swift

8
推荐指数
2
解决办法
1万
查看次数

处理网络错误以及绑定到tableView(Moya,RxSwift,RxCocoa)

我目前正在使用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)

uitableview swift rx-swift moya

8
推荐指数
1
解决办法
4362
查看次数

RxSwift:将元素追加到Observable <[_]>

我有一个array(Observable<[_]>),它是tableview的数据源.我希望能够向它添加新元素,并在每次将新元素附加到数组时更新tableview.我找不到如何添加新元素Observable<[_]>.

swift rx-swift

8
推荐指数
1
解决办法
7837
查看次数

如何在RxSwift中选择CollectionView单元格

我需要使用RxSwift选择集合视图中特定索引处的项目.此方法无法正常工作.

 collectionView.rx.modelSelected(SearchResult.self).subscribe(onNext:{ menuItem in }).addDisposableTo(disposeBag) 
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

ios uicollectionview rx-swift swift3

8
推荐指数
1
解决办法
3709
查看次数

如何在 RxSwift 中为行编写高度?

我想将以下代码转换为RxSwift. 还请帮助我如何ActionRxSwift.

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)

ios reactive-cocoa rx-swift swift3

8
推荐指数
3
解决办法
8398
查看次数

更改变量中的一个属性会触发其他属性的子目录.RxSwift

我有以下属性结构 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)

system.reactive ios rxjs swift rx-swift

8
推荐指数
1
解决办法
2290
查看次数

使用RxSwift观察Swift 3中的数组

RxSwift在Swift 2中创建一个可观察的数组,我用它来做:

[1, 2, 3].toObservable().subscribeNext { print($0) }
Run Code Online (Sandbox Code Playgroud)

但是在Swift 3中,它不再起作用了,我收到了这个错误:

类型'[Int]'的值没有成员'toObservable'

如何RxSwift从swift数组创建一个可观察的数组?

ios swift rx-swift reactivex

8
推荐指数
2
解决办法
1万
查看次数

Xcode 中两个目标中的 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 包依赖项,我也会遇到此问题。

xcode ios swift rx-swift swift-package-manager

8
推荐指数
1
解决办法
3230
查看次数

RXSwift 未订阅主线程

我正在尝试进行多个 API 调用并填充 Realm 数据库。一切正常。但是,当我尝试performSegue()subscribe()方法上运行时,会引发异常,通知我无法在后台线程上执行此操作,这是完全合理的。

但是既然我订阅了MainScheduler.instancesubscribe()方法不应该在 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)即使在做什么?

ios swift rx-swift

8
推荐指数
1
解决办法
5379
查看次数

`.drive()` 和 `.bind(to:)` 之间的区别

我目前正在学习 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()甚至有必要使它成为一个不会失败的东西。

ios swift rx-swift rx-cocoa

8
推荐指数
1
解决办法
1561
查看次数