标签: rx-swift

在RxSwift驱动程序中使用[无主自我]是否安全?

例:

tapGestureRecognizer.rx.event.asDriver()
    .drive(onNext: { [unowned self] _ in
        self.view.endEditing(true)
    })
    .disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

既然disposeBag是自我控制,我会假设是吗?

swift rx-swift

7
推荐指数
1
解决办法
736
查看次数

7
推荐指数
1
解决办法
2140
查看次数

正确使用RxSwift链接请求,flatMap或其他什么?

首先,我是rxswift的新手所以我想答案是显而易见的,但此刻我自己找不到解决方案.

我有两个功能:

func downloadAllTasks() -> Observable<[Task]>
func getTaskDetails(taskId: Int64) -> Observable<TaskDetails>
Run Code Online (Sandbox Code Playgroud)

第一个是使用网络请求下载Task对象列表,第二个是下载sepcific任务的任务详细信息(使用它的id)

我想要实现的是下载所有任务,然后为每个任务我要下载其详细信息并订阅所有任务详细信息准备就绪时触发的事件.

所以我想我应该以某种方式订阅Observable <[TaskDetails]>,但我不知道该怎么做.

        downloadAllTasks()
        .flatMap{
            ... // flatMap? something else?
        }
        .subscribe(
            onNext: { details in
                print("tasks details: \(details.map{$0.name})")
        })
        .addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)

//编辑

感谢Silvan Mosberger回答我更接近解决方案.还有一个问题.现在我有这样的事情:

    downloadAllTasks()
        .flatMap{ Observable.from($0) } 
        .map{ $0.id }
        .flatMap{ [unowned self] id in
            self.getTaskDetails(taskId: id).catchError{ error in
                print("$$$ Error downloading task \(id)")
                return .empty()
            }
        }
        .do(onNext: { _ in
            print(" $$$ single task details downloaded")
        } )
        .toArray()
        .debug("$$$ task details array debug", trimOutput: …
Run Code Online (Sandbox Code Playgroud)

ios swift rx-swift

7
推荐指数
1
解决办法
8110
查看次数

如何在xcode的Playground中导入RxSwift?

我试图在xcode playground中导入rxswift:

gem install cocoapods-playgrounds
Run Code Online (Sandbox Code Playgroud)

在那之后

pod playgrounds RxSwift
Run Code Online (Sandbox Code Playgroud)

但它没有发生.怎么做?

xcode cocoapods swift rx-swift

7
推荐指数
2
解决办法
4647
查看次数

如何通过被动(RxSwift)调用替换UICollectionViewDelegateFlowLayout?

有没有办法替换方法

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
Run Code Online (Sandbox Code Playgroud)

UICollectionViewDelegateFlowLayout协议使用RxSwift反应的东西?

swift rx-swift rx-cocoa

7
推荐指数
1
解决办法
604
查看次数

如何获取UIAlertController observable(ReactiveCocoa或RxSwift)?

我实施了"反应",UIAlertController所以我可以Observable<Int>按下按钮.(见下面的代码).

我的问题或疑问是:

  • 这个实现是否正确?我不喜欢存放观察者; 我想知道是否有更好的解决方案.
  • 或者...... ReactiveCocoa或RxSwift中是否已实现此功能?

这是实施.我删除了与te问题无关的部分.

class AlertBuilder {

    typealias AlertAction = (Int) -> ()

    private let alert: UIAlertController

    /** If observable() is called, we keep here the observers to notify them */
    private var observers: [AnyObserver<Int>] = []

    init(alert: UIAlertController) {
        self.alert = alert
    }

    /** When using observable(), the action is not needed. */
    func button(_ title: String, style: UIAlertActionStyle = .default, action: AlertAction? = nil) -> AlertBuilder {

        let buttonIndex = alert.actions.count …
Run Code Online (Sandbox Code Playgroud)

ios reactive-cocoa rx-swift

7
推荐指数
1
解决办法
2523
查看次数

如何使用 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
查看次数

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 中的网络请求调度器

从一开始,我就一直在学习 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
查看次数