标签: rx-swift

可观察的当前和先前价值

我有一个变量,它是一个枚举值数组.这些值随时间而变化.

enum Option {
    case One
    case Two
    case Three
}

let options = Variable<[Option]>([ .One, .Two, .Three ])
Run Code Online (Sandbox Code Playgroud)

然后我观察这个变量的变化.问题是,我需要知道最新值和前一个值之间的差异.我现在正在这样做:

let previousOptions: [Option] = [ .One, .Two, .Three ]

...

options
    .asObservable()
    .subscribeNext { [unowned self] opts in
        // Do some work diff'ing previousOptions and opt
        // ....
        self.previousOptions = opts
    }
Run Code Online (Sandbox Code Playgroud)

是否内置了RxSwift可以更好地管理它?有没有办法始终从信号中获取先前值和当前值?

swift rx-swift

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

是否有一个Observable的首选类型,在Next事件中不需要值?

我有一个Observable,它只用于触发flatMap/ map.所以我只需要这个Next活动,而不是一个价值.我可以将自己的概念用于这样的垃圾值,但我想知道是否有一个RxSwift约定.

这是我正在处理的事情:

// I'd rather not have an Element type that someone might use
let triggeringObservable: Observable<SomeSessionClass> 

// ...

triggeringObservable.map { _ -> String in // The actual value is ignored
    return SomeLibrary.username() // `username()` is only ready when `triggeringObservable` sends Next
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,triggeringObservablerx_observer在将让我们知道,库某些属性username()是随时可以调用.

swift rx-swift reactivex

11
推荐指数
4
解决办法
5684
查看次数

RxSwift/RxCocoa:防止UITextField具有多个......字符

我想有一个UITextField配置RxSwift/RxCocoa,以便它只包含...字符.我不想使用UITextFieldDelegate这个,但很想用RxSwift/RxCocoa实现这一点.有没有办法做到这一点?

swift rx-swift rx-cocoa

11
推荐指数
1
解决办法
3723
查看次数

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中合并两个通知观察器

我有这段代码:

let appActiveNotifications: [Observable<NSNotification>] = [
    NSNotificationCenter.defaultCenter().rx_notification(UIApplicationWillEnterForegroundNotification),
    NSNotificationCenter.defaultCenter().rx_notification(Constants.AppRuntimeCallIncomingNotification)
]

appActiveNotifications.merge()
  .takeUntil(self.rx_deallocated)
  .subscribeNext() { [weak self] _ in
  // notification handling
}
.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)

它应该监听任何指定的通知,并在触发任何通知时进行处理.

但是这不会编译.我收到以下错误:

Value of type '[Observable<NSNotification>]' has no member 'merge'
Run Code Online (Sandbox Code Playgroud)

那么我应该如何将这两个信号合并为一个呢?

swift rx-swift reactivex

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

在RxSwift中手动处理DisposeBag

我想取消一个请求,其中一种方法是手动取出一次性袋子.

.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)

因为我有disposeBag对象,除了我上面提到的那个之外,有没有一种方法可以取消请求?

swift rx-swift

10
推荐指数
2
解决办法
6056
查看次数

使用RxSwift进行Paginated API调用

我正在为iOS应用程序开始我的第一个RxSwift项目并学习反应式编程.

到目前为止,这个想法非常简单,用户搜索与搜索栏文本匹配的电影,这会触发一个请求,用于填充带有结果的UITableView.使用在线发现的教程和示例我已经设法实现这一点而不会有太多麻烦.

当我试图加载通过滚动表格视图底部触发的下一页结果时,棘手的部分就出现了.

这是到目前为止使用的代码:

public final class HomeViewModel: NSObject {

    // MARK: - Properties

    var searchText: Variable<String> = Variable("")
    var loadNextPage: Variable<Void> = Variable()

    lazy var pages: Observable<PaginatedList<Film>> = self.setupPages()

    // MARK: - Reactive Setup

    fileprivate func setupPages() -> Observable<PaginatedList<Film>> {
        return self.searchText
            .asObservable()
            .debounce(0.3, scheduler: MainScheduler.instance)
            .distinctUntilChanged()
            .flatMapLatest { (query) -> Observable<PaginatedList<Film>> in
                return TMDbAPI.Films(withTitle: query, atPage: 0)
            }
            .shareReplay(1)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止:observable pages绑定到我的表视图HomeViewController,其搜索栏文本绑定到searchText.

我正在使用Alamofire在幕后执行API调用,并TMDbAPI.Films(withTitle: query)返回一个Observable的分页列表.

这是我的模型结构 PaginatedList

public struct PaginatedList<T> { …
Run Code Online (Sandbox Code Playgroud)

pagination observable swift rx-swift reactivex

10
推荐指数
2
解决办法
5735
查看次数

什么是RxSwift 3.0相当于RxSwift 2.x的AnonymousDisposable?

所述ReactiveX.io文档使用AnonymousDisposable,这是在RxSwift 2.x中,但是在RxSwift 3.0未解决的识别符.我应该用什么呢?

let source = Observable.create { observer in
  for i in 1...5 {
    observer.on(.Next(i))
  }
  observer.on(.Completed)

  // Note that this is optional. If you require no cleanup you can return
  // NopDisposable.instance
  return AnonymousDisposable {
    print("Disposed")
  }
}

source.subscribe {
  print($0)
}
Run Code Online (Sandbox Code Playgroud)

swift rx-swift swift3

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

Combine + SwiftUI中的最佳数据绑定实践?

在RxSwift中,很容易将a DriverObservablein 绑定到a View Model中的某个观察者ViewController(即UILabel)。

我通常更喜欢用其他可观察变量创建的可观察变量建立一个管道,而不是“强制”推送值(例如通过a PublishSubject)。

让我们使用此示例:从网络中获取一些数据后更新aUILabel


RxSwift + RxCocoa示例

final class RxViewModel {
    private var dataObservable: Observable<Data>

    let stringDriver: Driver<String>

    init() {
        let request = URLRequest(url: URL(string:"https://www.google.com")!)

        self.dataObservable = URLSession.shared
            .rx.data(request: request).asObservable()

        self.stringDriver = dataObservable
            .asDriver(onErrorJustReturn: Data())
            .map { _ in return "Network data received!" }
    }
}
Run Code Online (Sandbox Code Playgroud)
final class RxViewController: UIViewController {
    private let disposeBag = DisposeBag()
    let rxViewModel = RxViewModel() …
Run Code Online (Sandbox Code Playgroud)

ios swift rx-swift swiftui combine

10
推荐指数
2
解决办法
1248
查看次数