我正在尝试将我的FRP理解从ReactiveCocoa 2.5迁移到RxSwift,我有一个误解.在ReactiveCocoa中,我rac_signalForSelector想在观察方法的调用时使用.有没有办法使用RxSwift实现这个逻辑?
我写了一个小例子,我想在test方法调用时处理订阅.但是在订阅块中我仍然可以看到一个next(6)事件.我究竟做错了什么?
let subject = PublishSubject<Int>()
subject.takeUntil(self.rx.sentMessage(#selector(test))).subscribe { event in
print(event)
}
subject.onNext(3)
test()
subject.onNext(6)
//////////////////
func test() {
}
Run Code Online (Sandbox Code Playgroud) 这是我的代码段:
class ProductCategoryCell: UITableViewCell {
@IBOutlet weak var collectionViewProducts: UICollectionView!
// other stuff...
func setProducts() {
let productsObservable = Observable.just([
Product(name: "test", price: 10.0),
Product(name: "test", price: 10.0),
Product(name: "test", price: 10.0)
])
productsObservable.bindTo(collectionViewProducts.rx.items(cellIdentifier: "ProductCell", cellType: ProductCell.self)) {
(row, element, cell) in
cell.setProduct(element)
}.disposed(by: disposeBag)
}
}
Run Code Online (Sandbox Code Playgroud)
它给了我一个构建错误:
没有“项目”候选项产生预期的上下文结果类型“((Observable <[Product]>)->(_)-> _”
在我的视图控制器中,我用类似的代码填充表视图:
let productsObservable = Observable.just(testProducts)
productsObservable.bindTo(tableViewProducts.rx.items(cellIdentifier: "ProductCategoryCell", cellType: ProductCategoryCell.self)) { (row, element, cell) in
cell.setCategory(category: element)
}.disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)
此代码正常工作。我究竟做错了什么?
我正在使用RxSwift for TableView.我需要先计算WillDisplayCell委托方法中我做过的动态单元格的高度.我不知道如何将TableView Delegate方法与RxSwift绑定.任何人都可以帮忙吗?
我正在处理这种情况,我想在这里应用 RxSwift。
我有.xib带按钮的 UIView。
class RightButtonItemView: UIView {
@IBOutlet weak var rightButtonimageView: UIImageView!
@IBOutlet weak var rightButtonButton: UIButton!
let performEventSegue = PublishSubject<Bool>()
class func instanceFromNib() -> RightButtonItemView {
return UINib(nibName: "NotificationView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! RightButtonItemView
}
override func awakeFromNib() {
//I'm not sure how should I link button tap and my subject
rightButtonButton.rx.tap
}
}
Run Code Online (Sandbox Code Playgroud)
我在 viewController 中创建了这个视图的一个实例
var rightButtonItemView = RightButtonItemView.instanceFromNib()
Run Code Online (Sandbox Code Playgroud)
Bu从我的segue点击这个按钮我需要移动到下一个VC,所以我订阅了UIView的主题
rightButtonItemView.performEventSegue.asObserver().subscribe(onNext: { (isAuthorized) in
if isAuthorized {
let storyboard = UIStoryboard(name: "Notifications", …Run Code Online (Sandbox Code Playgroud) 当我观察我的领域模型并将更改绑定到表视图时,它可以工作.但是当我尝试向表中添加行时,我发生了一些崩溃
由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'尝试将第1行插入第0部分,但更新后第0部分只有1行'
我可以不使用标准委托方法吗?
这是我的代码片段
let realm = try! Realm()
let places = realm.objects(Place.self)
Observable.from(places)
.bindTo(tableView.rx.items(cellIdentifier: "PlaceCell", cellType: PlaceCell.self)) { (row, element, cell) in
let viewModel = PlaceCellViewModel(place: element)
cell.setup(viewModel: viewModel)
}
.addDisposableTo(disposeBag)
Observable.changesetFrom(places).subscribe(onNext: { [weak self] result, changes in
if let changes = changes {
self?.tableView.beginUpdates()
let indexes = changes.inserted.map { IndexPath(row: $0, section: 0) }
self?.tableView.insertRows(at: indexes, with: .bottom)
self?.tableView.endUpdates()
} else {
self?.tableView.reloadData()
}
})
.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud) 我是RxSwift的新手,我有以下代码来设置一个包含文本字段的tableview:
budget.expenses.asObservable()
.bindTo(tableView.rx.items(cellIdentifier: ExpenseInputCell.cellIdentifier, cellType: ExpenseInputCell.self)){(row, element, cell) in
cell.name.text = element.name.value
cell.name.rx.text
.bindTo(element.name)
.addDisposableTo(self.disposeBag)
}
.addDisposableTo(disposeBag)
tableView.rx.itemDeleted
.subscribe(onNext: {indexPath in
self.budget.expenses.value.remove(at: indexPath.row)
})
.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)
一切工作正常,直到删除一行,因为然后混合了文本字段与数组中正确对象的绑定。例如,假设我在表视图中有7个项目,并且删除了第5行,新的第5和第6行的值都相同
我试图检测一个observable(我的情况button.rx.tap)是否没有发出任何值,比如3秒.如果是,我想更新用户界面.这是我到目前为止的尝试:
Observable<Int>.interval(3, scheduler: MainScheduler.instance)
.takeUntil(button.rx.tap) // I know take until will stop the timer sequence
.subscribe({ event in
print(event)
UIView.animate(withDuration: 0.4, animations: {
if let number = event.element {
let scale: CGFloat = number % 2 == 0 ? 1.5 : 1.0
self.button.transform = CGAffineTransform(scaleX: scale, y: scale)
}
})
})
.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)
我的目标是在没有按下按钮三秒钟时为视图设置动画.我已经尝试过扫描,distinctUntilChanged和debounce但是我遇到的大多数组合运算符只会在observable发出一个项目时才会发出项目.任何帮助深表感谢.
我需要从网络请求不同类型的模型,然后将它们组合为一个模型。如何链接多个可观察物并返回另一个可观察物?
我有类似的东西:
func fetchDevices() -> Observable<DataResponse<[DeviceModel]>>
func fetchRooms() -> Observable<DataResponse<[RoomModel]>>
func fetchSections() -> Observable<DataResponse<[SectionModel]>>
Run Code Online (Sandbox Code Playgroud)
我需要做类似的事情:
func fetchAll() -> Observable<(AllModels, Error)> {
fetchSections()
// Then if sections is ok I need to fetch rooms
fetchRooms()
// Then - fetch devices
fetchDevices()
// And if everything is ok create AllModels class and return it
// Or return error if any request fails
return AllModels(sections: sections, rooms: rooms, devices:devices)
}
Run Code Online (Sandbox Code Playgroud)
如何用RxSwift实现呢?我阅读了文档和示例,但了解了如何链接相同类型的可观察对象
我想给我的文本字段一个货币格式,所以当我键入它的时候看起来像:
$ 0.00
$ 0.09
$ 0.98
$ 9.87
$ 98.76
由于我在项目中使用Rx,因此我真的不想使用通知或委托。
我正在尝试创建一个searchBar,它通过带有请求的MKLocalSearch搜索地址,并使用RXSwift并绑定到RXCocoa
到目前为止,我已经做了以下1.过滤和去抖,以避免太多的请求:
let searchRes = searchBar.rx.text
.orEmpty
.filter { query in
return query.characters.count > 4
}
.debounce(1, scheduler: MainScheduler.instance)
Run Code Online (Sandbox Code Playgroud)
生成的String查询是map:ed以创建MKLocationSearch,然后是flatMapp:ed以返回MKMapItems数组,以便能够将数组绑定到tableView的项目:
searchRes.map{query -> MKLocalSearch in
let request = MKLocalSearchRequest()
request.naturalLanguageQuery = query
request.region = self.mapView.region
return MKLocalSearch(request: request)
}.flatMapLatest{search -> Observable<[MKMapItem]> in
search.start(completionHandler:{(response, error) in
let items: Variable<[MKMapItem]> = Variable([])
if let resp = response {
//need to return the result form this
// i.e. items.value = response.mapItems
}
//can not return from here since the request is async
}
}.bindTo …Run Code Online (Sandbox Code Playgroud)我是 RxSwift 和 RxCocoa 的新手,我正在学习它。
我想在按钮单击时验证所有文本字段,并根据验证我需要向用户显示警报消息。
验证成功后,我需要在表中插入记录。
参考以下代码...
var result = txtFname.rx.text
result.asObservable().subscribe(onNext: { text in
if text!.isEmpty {
self.showAlert(msg: "Plese enter first name.")
self.txtFname.becomeFirstResponder()
}
}).disposed(by: disposeBag)
result = txtLname.rx.text
result.asObservable().subscribe(onNext: { text in
if text!.isEmpty {
self.showAlert(msg: "Please enter last name.")
self.txtLname.becomeFirstResponder()
}
}).disposed(by: disposeBag)
result = txtEmail.rx.text
result.asObservable().subscribe(onNext: { text in
if text!.isEmpty {
self.showAlert(msg: "Please enter email id.")
self.txtLname.becomeFirstResponder()
}
}).disposed(by: disposeBag)
//need to check here if all fields are valid or not
//if all fields …Run Code Online (Sandbox Code Playgroud)