标签: rx-swift

RxSwift:返回一个带有错误的新observable

我有一个返回Bool Observable的函数,具体取决于它是否正常.

func test() -> Observable<Bool> {
   if everythingIsOk {
      return just(true)
   }
   return just(false) <- how can i here return a custom error to retrieve what failed?
}
Run Code Online (Sandbox Code Playgroud)

ios swift rx-swift

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

RxSwift正确使用变量

我正在尝试将项目转换为使用RxSwift和MVVM.我有一个服务,在每个应用程序启动时同步来自Parse的数据列表,我基本上想确保我采取正确的方法.

我所做的是成为一个可变主题,然后允许我的模型听这个.ParseService:

let rx_parseMushrooms = Variable<[ParseMushroom]>([])
Run Code Online (Sandbox Code Playgroud)

MushroomLibraryModel:

_ = parseService.rx_parseMushrooms
    .asObservable()
    .map { (parseMushrooms:[ParseMushroom]) -> [Mushroom] in
        let mushrooms = parseMushrooms.map { (parseMushroom:ParseMushroom) -> Mushroom in
            let mushroom = Mapper<Mushroom>().map(parseMushroom.dictionaryWithValuesForKeys(parseMushroom.allKeys()))
            return mushroom!
        }

        return mushrooms
    }
    .subscribeNext({ (mushrooms:[Mushroom]) -> Void in
        self.mushrooms = mushrooms
        print(mushrooms)
    })
Run Code Online (Sandbox Code Playgroud)

我也是这样表达同步状态的.

ParseService:

struct SyncState {
    enum State {
        case Unsynced, ConnectingToServer, SyncingInfo, FetchingImageList, SyncingImages, SyncComplete, SyncCompleteWithError
    }

    var infoToSync = 0
    var imagesToSync = 0
    var imagesSynced = 0

    var state = State.Unsynced
} …
Run Code Online (Sandbox Code Playgroud)

architecture mvvm swift rx-swift

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

RxSwift中的双向绑定

我在RxSwift的示例代码中读取了双向绑定运算符.

func <-> <T>(property: ControlProperty<T>, variable: Variable<T>) -> Disposable {
    let bindToUIDisposable = variable.asObservable()
        .bindTo(property)
    let bindToVariable = property
        .subscribe(onNext: { n in
            variable.value = n
        }, onCompleted:  {
            bindToUIDisposable.dispose()
        })

    return StableCompositeDisposable.create(bindToUIDisposable, bindToVariable)
}
Run Code Online (Sandbox Code Playgroud)

property改变,它会通知变量,并设置变量的值,而该变量的值时,它会通知物业.我认为这会导致无休止的循环......

functional-programming ios reactive-cocoa swift rx-swift

9
推荐指数
3
解决办法
9914
查看次数

如何将rx_tap(UIButton)绑定到ViewModel?

我有2个UITextField属性和1个UIButton的授权控制器.我想将View绑定到ViewModel,但不知道如何操作.这是我的AuthorizatioVC.swift:

class AuthorizationViewController: UIViewController {

let disposeBag = DisposeBag()

@IBOutlet weak var passwordTxtField: UITextField!
@IBOutlet weak var loginTxtField: UITextField!

@IBOutlet weak var button: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()

    addBindsToViewModel()

}

func addBindsToViewModel(){
    let authModel = AuthorizationViewModel(authClient: AuthClient())

    authModel.login.asObservable().bindTo(passwordTxtField.rx_text).addDisposableTo(self.disposeBag)
    authModel.password.asObservable().bindTo(loginTxtField.rx_text).addDisposableTo(self.disposeBag)
  //HOW TO BIND button.rx_tap here?

}

}
Run Code Online (Sandbox Code Playgroud)

这是我的AuthorizationViewModel.swift:

final class AuthorizationViewModel{


private let disposeBag = DisposeBag()

//input
//HOW TO DEFINE THE PROPERTY WHICH WILL BE BINDED TO RX_TAP FROM THE BUTTON IN VIEW???
let authEvent = ???
let login = …
Run Code Online (Sandbox Code Playgroud)

ios swift rx-swift

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

如何在RxSwift中取消订阅Observable?

我想取消订阅RxSwift中的Observable.为了做到这一点,我曾经将Disposable设置为nil.但在我看来,在更新到RxSwift 3.0.0-beta.2后,这个技巧不起作用,我无法取消订阅Observable:

//This is what I used to do when I wanted to unsubscribe
var cancellableDisposeBag: DisposeBag?

func setDisposable(){
    cancellableDisposeBag = DisposeBag()
}

func cancelDisposable(){
    cancellableDisposeBag = nil
}
Run Code Online (Sandbox Code Playgroud)

那么可能有人可以帮我如何正确取消订阅Observable?

ios swift rx-swift

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

RxSwift在select上修改tableview单元格

我的应用程序中有一个表格视图.我使用以下代码为此表生成了数据源

struct ContactNameNumberBlockStatus {
    var contactThumbnail: Data?
    var contactName : String
    var contactNumber: String
    var blockStatus : Bool
}

class BlockListTableViewCell: UITableViewCell {
    @IBOutlet weak var contactImage: UIImageView!
    @IBOutlet weak var contactName: UILabel!
    @IBOutlet weak var contactNumber: UILabel!
    @IBOutlet weak var blockButton: UIButton!
    var eachCell : ContactNameNumberBlockStatus! {
        didSet {
            // setting ui
        }
    }
}

private func showTableContent(data :   Observable<[ContactNameNumberBlockStatus]>) {
        data.bindTo(tableView.rx.items(
            cellIdentifier: "BlockListTableViewCell")) {
            row, contributor, cell in
            if let cell2 = cell as? BlockListTableViewCell {
                cell2.eachCell = …
Run Code Online (Sandbox Code Playgroud)

ios rx-swift rx-cocoa

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

每次UxextField文本属性在RxSwift中更改时,如何获取信号

如何通过编程更改UITextField文本属性获得信号?通过使用rx.text仅在用户通过键盘输入文本时报告信号.如果以编程方式设置textField.text,则不会触发信号.

这就是我使用rx.text的方式

(self.phoneNumberTextField.rx.text).orEmpty.subscribe(onNext: { [weak self] (phone) in
         // do something
    }).addDisposableTo(disposeBag)
    self.phoneNumberTextField.text = "this is for test"
Run Code Online (Sandbox Code Playgroud)

谢谢!

ios swift rx-swift

9
推荐指数
3
解决办法
5103
查看次数

RX中是否存在只读的BehaviorSubject接口,如果不存在,那么制作一个接口是不是一个坏主意?

RX的实现提供BehaviorSubject<T>Variable<T>作为随时间变化的建模特性机制(C#INotifyPropertyChanged的一种有用的替代品).

通常这些都是暴露的,Observable<T>但是将属性公开为更有用:

class ObservableValue<T> : Observable<T>{
  var currentValue:T { get }
}
Run Code Online (Sandbox Code Playgroud)

这可以在swift中沿着这些行创建:

class ObservableValue<Element> : ObservableType {

  typealias E = Element

  private let subject:BehaviorSubject<E>

  var currentValue:E {
      get {
          return try! subject.value()
      }
  }

  init(subject:BehaviorSubject<E>) {
      self.subject = subject
  }

  func subscribe<O: ObserverType where O.E == E>(observer: O) -> Disposable {
      return self.subject.subscribe(observer)
  }
Run Code Online (Sandbox Code Playgroud)

}

这已经存在了吗?如果不是因为它违背了Rx的目标?

围绕它的唯一方法是公开一个单独的currentValue或写消费者,假设暴露的Observable背后的具体实现是BehaviourSubject或链中的某个地方发生了重放(),例如以下代码片段并未明确表示当我订阅时,我会得到一个值:

class MyViewModel {
  // 'I will notify you of changes perhaps including my current value'
  myProperty:Observable<String> …
Run Code Online (Sandbox Code Playgroud)

system.reactive swift rx-swift

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

在UICollectionViewCell中为UIButton设置rx.tap的问题 - RxSwift 3

我为1 UIButton订阅了2次:

  1. 首次订阅,用于在每次点击时更新UI
  2. 第二次订阅,用于在累积点击后每1秒更新一次Web服务上的值.

码:

class ProductionSize {
    var id : Int?
    var size: Int = 0
    var name: String = ""
}

class ProductionCell: UICollectionViewCell {
    var rxBag = DisposeBag()


    // this will be set in the (cellForItemAt indexPath: IndexPath) of collection view
    var productionSize: ProductionSize? {
        didSet {
            showProductionSize()
            prepareButton()
        }
    }

    func showProductionSize() {
        // ... code for showing ProductionSize in labels
    }

    func prepareButton() {
        // This for subscribing for every click for displaying purpose

        btn_increase.rx.tap …
Run Code Online (Sandbox Code Playgroud)

reactive-programming ios rx-swift swift3 rx-cocoa

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

.subscribe和.drive有什么区别

我是反应式编程的新手,这是我正在尝试的

.驾驶

searchController.rx.text
        .asDriver()
        .drive(onNext: { (element) in
            print(element)
        }).disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

.订阅

searchController.rx.text
        .asObservable()
        .subscribe(onNext: { (element) in
            print(element)
        }).disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

这两个区块的工作完全一样,什么是使用的目的.drive.subscribe?在这情况下,我们应该使用.drive.subscribe

任何帮助将不胜感激

reactive-programming rx-swift reactivex

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