忽略Completable上的错误 - RxSwift

时间:2018-02-10 09:58:42

标签: ios swift rx-swift

如果出现错误,是否有办法忽略完成表? 例如,我不想删除$check_user_details = mysql_query("select * from `employee` where `username` = '".mysql_real_escape_string($_SESSION["VALID_USER_ID"])."'"); //Validate created session if(mysql_num_rows($check_user_details) < 1) { session_unset(); session_destroy(); header("location: login.php"); exit; } //Get all the logged in user information from the database users table $get_user_details = mysql_fetch_array($check_user_details); if(isset($_POST['accept'])) { $msg = "Approved"; //$assignee=$_POST['accept']; $assignee = $get_user_details['fullname']; } 中的值,并在第一个完成时完成时将图片删除到Firebase Realtime Database

Firebase Storage

存储上可能不存在图片,因此// MARK: DELETE - FUNCTION public func delete(id: String) -> Completable { return databaseRef.child("objects").child(id).rx.removeValueAsCompletable() .andThen(storageRef.child("objects").child(id).rx.delete()) } 函数如果子元素不存在则返回错误,并且delete函数的Completable也返回错误。如果它返回错误我不想忽略第二个函数,是否可能? RxSwift中是否存在名为delete(id: String)的函数,或类似的东西?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

没有ignoreError(),但您可以尝试使用选项来解决这个问题。 Completable.catchError可以有效,但要求您返回另一个有效的Completable。它更像是“错误地图”。

如果您只是在错误时完成,那么您将全部设置为catchError

如果您在错误时需要完成,我建议您将此映射到Observable<Void> .next.completedCompletable .next 1}}源序列完成。借助Observable<Void>的强大功能,您可以将错误映射到而不是完成。

我们假设您的Completable基于.map(Optional.init)

  1. 将您的序列转换为一系列可选项:nil
  2. 将序列中的错误转换为.catchErrorJustReturn(nil).filter { $0 != nil }.map { $0! }
  3. 返回非零值,有效忽略错误:Completable或类似。
  4. 如果你最后需要一个Observable<Void>但现在有一个.concat(.never()).asCompletable(),请尝试再将其转换回来:b.py毕竟,你知道到目前为止只生成一个过程元素,错误或完成事件。

答案 1 :(得分:0)

您可以使用 .catchError { _ in .empty() }

public func delete(id: String) -> Completable {
     databaseRef.child("objects").child(id).rx.removeValueAsCompletable()
        .andThen(storageRef.child("objects").child(id).rx.delete())
        .catchError { _ in .empty() }
}

它将错误转换为空的 Completable。