因此,我有一些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),然后将该 …
我正在寻找这样的东西:
let observable = PublishSubject<String>()
observable.onNext("1")
observable.onCompleted()
_ = observable.subscribeNext { s in
print(s)
}
Run Code Online (Sandbox Code Playgroud)
所以我想在已经完成后订阅Observable并仍然获取值(或者只是最后一个值).
我想用CLLocationManager用RxSwift像
https://github.com/ReactiveX/RxSwift/issues/413
但我发现CLLocationManager扩展感动得RxExample
(这里提到https://github.com/ReactiveX/RxSwift/issues/900)。
我的问题是:如何使用该代码?当我输入RxSwift和RxCocoa我没有获得如locationManager.rx.didUpdateLocations。我应该怎么做才能使用CoreLocationwith RxSwift?
我正在使用 Xcode 8、Swift 3。
在此先感谢您的帮助!
我发现,这是建议,现在我们必须只复制和粘贴CLLocationManager从分机RxExample(详见这里提交该意见)。
我在理解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 ”是什么意思?
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) 我有一个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'开头的人的可观察序列
这该怎么做 ??
我是 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) 我想阻止我的 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) 从一开始,我就一直在学习 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 …
我的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) rx-swift ×10
swift ×7
ios ×5
swift3 ×3
alamofire ×1
cllocation ×1
control-flow ×1
moya ×1
reactivex ×1
type-erasure ×1
uipickerview ×1