标签: rx-swift

RxSwift通过一系列flatMaps传播值

因此,我有一些RxSwift代码,我想在其中执行一系列异步操作,所有这些操作均由可观察对象组成。flatMap是这样做的方法,并且效果很好,但是似乎无法将变量传递给我可以确定的链。最好用一些伪代码来说明

假设有3个功能

class Connection {
    static func establish(address:String) -> Observable<Connection>
    func sendData(data:String) -> Observable<Int> // num bytes written or something
    func close() -> Observable<Void>
}
Run Code Online (Sandbox Code Playgroud)

我想将它们称为链,以便我们连接,发送然后关闭。像这样

Connection.establish(host)
    .flatMap{ connection in connection.sendData("foo") }
    .flatMap{ numBytes in ????.close() }
    .subscribeNext{ /* all done */ }
Run Code Online (Sandbox Code Playgroud)

问题在于,flatMap它不会沿链传递其输入参数,因此传递给的闭包subscribeNext无法访问该connection对象,因此无法调用close。

我可以像下面这样做一些骇人的骇客,但我真的不愿意!

var connection:Connection?
Connection.establish(host)
    .flatMap{ c in 
        connection = c
        return c.sendData("foo") 
    }
    .flatMap{ numBytes in connection!.close() }
    .subscribeNext{ /* all done */ }
Run Code Online (Sandbox Code Playgroud)

在Rx的C#版本中,这是通过使用重载来解决的,该重载SelectMany需要第二次闭合,该闭合将2个值组合在一起(通常合并为一个Tuple),然后将该 …

swift rx-swift

6
推荐指数
1
解决办法
1102
查看次数

在RxSwift PublishSubject上完成后订阅最后一个值

我正在寻找这样的东西:

let observable = PublishSubject<String>()
observable.onNext("1")
observable.onCompleted()

_ = observable.subscribeNext { s in
    print(s)
}
Run Code Online (Sandbox Code Playgroud)

所以我想在已经完成后订阅Observable并仍然获取值(或者只是最后一个值).

swift rx-swift reactivex

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

如何在 RxSwift 中使用 CLLocation 扩展

我想用CLLocationManagerRxSwift
https://github.com/ReactiveX/RxSwift/issues/413
但我发现CLLocationManager扩展感动得RxExample
(这里提到https://github.com/ReactiveX/RxSwift/issues/900)。

我的问题是:如何使用该代码?当我输入RxSwiftRxCocoa我没有获得如locationManager.rx.didUpdateLocations。我应该怎么做才能使用CoreLocationwith RxSwift

我正在使用 Xcode 8、Swift 3。

在此先感谢您的帮助!

更新

我发现,这是建议,现在我们必须只复制和粘贴CLLocationManager从分机RxExample(详见这里提交该意见)。

cllocation ios rx-swift swift3

6
推荐指数
1
解决办法
2412
查看次数

Swift:RxSwift 的 asObservable() 方法和类型擦除

我在理解RxSwift 的Observable 类中asObservable 方法的基本原理和目的时遇到问题。

/// A type-erased `ObservableType`. 
///
/// It represents a push style sequence.
public class Observable<Element> : ObservableType {
    /// Type of elements in sequence.
    public typealias E = Element

    public func subscribe<O: ObserverType>(_ observer: O) -> Disposable where O.E == E {
        abstractMethod()
    }

    public func asObservable() -> Observable<E> {
        return self
    }
}
Run Code Online (Sandbox Code Playgroud)

asObservable 返回 self 的目的是什么?

当然,如果您可以运行此方法,则您已经可以访问该对象。另外,ObservableType评论中的“type-erased ”是什么意思?

type-erasure rx-swift swift3

6
推荐指数
1
解决办法
2666
查看次数

如何使用 RXSwift 实现 UIPickerView

就像 UITableView

    items.bindTo(tableView.rx.items(cellIdentifier: "cellIdentifier", cellType: AttentionTableViewCell.self)){(row,dic,cell) in
        cell.configueCell(with: dic)
    }.addDisposableTo(dispose)
Run Code Online (Sandbox Code Playgroud)

uipickerview ios swift rx-swift

6
推荐指数
3
解决办法
7891
查看次数

如何过滤Observable元素的数组| RxSwift

我有一个struct Person和person数组如下

struct Person {
  let name : String
  let age : Int
}

let personArray = [
    Person(name : "Max", age : 32),
    Person(name : "Jones", age : 42),
    Person(name : "Other", age : 62)
]
Run Code Online (Sandbox Code Playgroud)

我创建了一个可观察的序列,如下所示

let seq = Observable.just(personArray)
Run Code Online (Sandbox Code Playgroud)

现在如何按相关人名过滤此数组?

例如,我想要一个包含name以'M'开头的人的可观察序列

这该怎么做 ??

rx-swift swift3

6
推荐指数
1
解决办法
4446
查看次数

RxSwift + 用户默认值

我是 RxSwift 的新手,就我而言,我想使用 UserDefaults 和 RxSwift 来简化我的代码,所以我做了以下代码

我的问题是,当我单击一个单元格时,但订阅方法提交了两次?那么我该怎么做才能解决它?多谢!

import UIKit

import RxSwift
import RxCocoa
import RxDataSources

class ViewController: UIViewController {
    let disposeBag = DisposeBag()

    @IBOutlet weak var tableView: UITableView! {
        didSet {
            tableView.register(UITableViewCell.self, forCellReuseIdentifier: String(describing: UITableViewCell.self))

            tableView.rx
                .itemSelected
                .subscribe { (indexPath) in
                    UserDefaults.standard.set("\(indexPath)", forKey: "key")
                }
                .disposed(by: disposeBag)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        UserDefaults.standard.rx
            .observe(String.self, "key")
            // .debug()
            .subscribe(onNext: { (value) in
                if let value …
Run Code Online (Sandbox Code Playgroud)

ios swift rx-swift

6
推荐指数
2
解决办法
5863
查看次数

RxSwift 如何有条件地控制按钮何时发出点击?

我想阻止我的 UIButtons 发出 RX tap 事件,直到某些控制流表明它已准备就绪。如果控制流恢复为未准备好,我希望再次禁用按钮。控制序列是一个ReplaySubject并且总是有值

我试过了skipUntil,但这是一次性操作——一旦控制序列发出,它就不能回到禁用状态——所有按钮按下都会通过,忽略控制序列

除非其他流具有特定值,否则如何限制 UIButton 发送点击事件?

let enableButtons = configStatusInputSequence
.filter { (configured, ready) -> Bool in
    return configured && ready
}

for button in controlButtons{
    button.rx.tap
        .skipUntil(enableButtons)
        .bind(to: commandOutputSequence)
        .disposed(by: bag)
}
Run Code Online (Sandbox Code Playgroud)

reactive-programming control-flow ios swift rx-swift

6
推荐指数
1
解决办法
2821
查看次数

RxSwift 中的网络请求调度器

从一开始,我就一直在学习 Rxswift 并将其应用到一个项目中。我希望你的帮助对一个概念更加放心。

我了解 UI 中的更改应该在 Mainscheduler 上执行.observeOn(MainSchedule…,如果您不使用Drivers.

我的疑问是:通常,我应该在执行网络请求时显式切换到后台线程吗?.

我还没有找到很多关于这一点的文献,但我已经阅读了一些项目代码,其中大多数没有,但有一些是。那些最终使用Drivers.observeOn(MainSchedule…在 UI 上进行更改。

例如,在https://www.thedroidsonroids.com/blog/rxswift-examples-4-multithreading 中,他说

So as you may guessed, in fact everything we did was done on a MainScheduler. Why? Because our chain starts from searchBar.rx_text and this one is guaranteed to be on MainScheduler. And because everything else is by default on current scheduler – well our UI thread may get overwhelmed. How to prevent that? Switch …

multithreading ios swift rx-swift

6
推荐指数
1
解决办法
3606
查看次数

如何使用 Alamofire + RxSwift 同步刷新访问令牌

我的fetchData()NetworkManager 类中有这个通用函数,它能够向网络发出授权请求,如果它失败(经过多次重试)会发出一个错误,该错误将重新启动我的应用程序(请求新的登录)。我需要同步调用这个重试令牌,我的意思是,如果多个请求失败,一次应该只有一个请求刷新令牌。如果一个失败,另一个请求必须被丢弃。我已经尝试了一些使用 DispatchGroup / NSRecursiveLock / 以及调用描述波纹管的函数 cancelRequests 的方法(在这种情况下,任务计数始终为 0)。我怎样才能使这种行为在这种情况下起作用?

  • 我的网络管理器类:

    public func fetchData<Type: Decodable>(fromApi api: TargetType,
                                           decodeFromKeyPath keyPath: String? = nil) -> Single<Response> {
        
        let request = MultiTarget(api)

        return provider.rx.request(request)
                .asRetriableAuthenticated(target: request)
    }

    func cancelAllRequests(){
        if #available(iOS 9.0, *) {
            DefaultAlamofireManager
                .sharedManager
                .session
                .getAllTasks { (tasks) in
                tasks.forEach{ $0.cancel() }
            }
        } else {
            DefaultAlamofireManager
                .sharedManager
                .session
                .getTasksWithCompletionHandler { (sessionDataTask, uploadData, downloadData) in
                    
                sessionDataTask.forEach { $0.cancel() }
                uploadData.forEach { $0.cancel() }
                downloadData.forEach { $0.cancel() }
            }
        } …
Run Code Online (Sandbox Code Playgroud)

swift alamofire rx-swift moya

6
推荐指数
1
解决办法
443
查看次数