小编Wuj*_*ujo的帖子

RxSwift - withLatestFrom组合来自两个可观察量的值

我想达到这样的结果:

L -1-2-3------4------5-6-7-8----
R ---------A------B----------C--

O ---------A3-----B4---------C8
Run Code Online (Sandbox Code Playgroud)

所以基本上类似于withLatestFrom,但结合了两个observable的值(比如最新组合).

我想没有现成的操作员.知道怎么做到这一点?

reactive-programming swift rx-swift

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

正确使用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
查看次数

RxSwift - 如何按顺序链接可观察量

假设我有 Int 数组:

var items = [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

一个接受 Int 参数并基于它发送网络请求的函数:

 func sendRequest(argument: Int) -> Observable<Void> {
    // sends network request
    ...
 }
Run Code Online (Sandbox Code Playgroud)

我想为 items 数组的每个元素发送网络请求,但我想按顺序执行,仅在前一个请求完成后才发送下一个请求。

我的第一次尝试是这样的:

let observables = items.map{ [weak self] argument in (self?.sendRequest(argument: argument) ?? Observable.empty()) }

let result = Observable.concat(observables)
Run Code Online (Sandbox Code Playgroud)

然而,这种方法同时发送请求并且仅按顺序组合结果。

我的第二种方法:

let items = [1, 2, 3, 4, 5]

var result = Observable.just(Void())

for item in items {
    result = result.flatMap{ [weak self] in  
        self?.sendRequest(argument: item) ?? Observable.empty() 
    }
}
Run Code Online (Sandbox Code Playgroud)

它似乎有效,但显然结果只有在所有网络请求完成后才会发出下一个元素。

我需要的是按顺序发送请求,并可观察结果,一旦每个请求完成,就会发出下一个事件。 …

iphone observable ios swift rx-swift

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

iCloud驱动器 - 是否可以访问用户文件

我将IOS项目配置为使用iCloud驱动器.现在我能够存储和读取应用程序无处不在的容器中的文件.

但是,是否可以从iCloud的根目录访问文件?我们假设用户将一些电影文件放入Mac上的iCloud Drive文件夹中.现在可以使用Iphone上的iCloud Drive应用程序查看和下载电影文件.我还可以从我的应用程序访问此文件吗?

或者,换句话说,我可以查询和访问用户上传到他的iCloud根文件夹的文件吗?

编辑:从我的调查看,它看起来访问这些文件的唯一方法是使用UIDocumentPickerViewController.我没有找到任何以编程方式访问文件的解决方案,因此我可以使用自定义UI过滤它们并显示给用户.

iphone ios icloud icloud-drive

6
推荐指数
0
解决办法
485
查看次数

使用经典 BT 和 BLE 与同一外设通信时出现“对等删除配对信息”错误

我们的 IOS 应用程序通过 BLE 与某些设备(Intel NUC)进行通信,写入一些特征。我们使用加密的特征,在我们第一次写入特征时强制系统配对。

同一设备上的另一个软件是使用经典 BT 同步联系人(电话簿访问配置文件)并将音乐从 iPhone 传输到英特尔 NUC。这还需要系统配对(与 BLE 连接所需的系统分开)。

一旦设备针对 BLE 和经典 BT 配置文件(两个单独的配对过程)进行配对,一切都会正常工作。当我们从系统 BT 设置中手动断开与外围设备的连接时,或者更糟糕的是,通过将 iPhone 置于 NUC 设备的范围之外时,就会出现问题。如果我们回来,设备在 BT 设置中保持断开连接,以便两台设备都在范围内。这应该不是问题,因为我们已配对进行 BLE 通信,因此我们应该能够与当前已断开连接但在范围内的设备进行连接。然而,当尝试通过 BLE 连接时,我们收到错误:

Domain=CBATTErrorDomain Code=14“对等点删除了配对信息” UserInfo={NSLocalizedDescription=对等点删除了配对信息}

我们连接到从CBCentralManager.retrievePeripherals(:withIdentifiers)方法返回的设备

一旦我们在系统 BT 设置中手动连接,一切都会重新开始工作。

我们尝试使用传递给 CBCentralManager.connect() 方法的 CBConnectPeripheralOptionEnableTransportBridgingKey 标志,但情况变得更糟。经典 BT 配置文件的系统配对存在问题,即使我们设法以某种方式做到这一点,也会通过 BLE 超时进行连接。

知道问题的原因是什么吗?

ios core-bluetooth

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

RxSwit - 来自可观察忽略错误的驱动程序

假设我有一些视图最初填充了一些数据。比我通过网络获取数据并想用这个更新的数据更新视图。

在这一点上,我想从这个 observable 创建 Driver 来驱动 UI 元素。但是,如果 observable 出现错误,我不想做任何事情,因为视图已经有一些数据,所以我只想忽略这样的错误。asDriver() 函数想要定义在出现错误时应该做什么。这样做可以吗:

let dataUpdated: Observable<DataItem> = ...

let driver = dataUpdated.asDriver(onErrorDriveWith: Driver<DataItem>.empty())
Run Code Online (Sandbox Code Playgroud)

?

swift rx-swift rx-cocoa

4
推荐指数
1
解决办法
2383
查看次数