gpt4 book ai didi

swift - 使用 RxSwift 链接操作

转载 作者:行者123 更新时间:2023-11-28 06:00:46 25 4
gpt4 key购买 nike

我想链接以下操作

  • 创建用户并验证
    • 创建匿名用户(user)
    • 验证用户 -> verifiedUser
    • 如果验证成功返回verifiedUser 否则返回user
  • 使用 coredata getStuff 获取内容
    • 如果 stuff.count > 0 使用用户凭证上传内容 uploadStuff
  • 最后报告所有操作的结果

我写的 createUserandVerify 如下。我想知道我应该如何以 react 方式编写 uploadStuff 。上传功能取决于用户凭据。因此它只能在 createUserandVerify 之后运行。我知道我可以只检查 uploadStuff 中的数组计数并返回空,但我想知道最佳实践。

func createUserandVerify() -> Single<User> {
return Service.sharedInstance.generateAnonUser()
.flatMap{ user in
if Service.sharedInstance.isOldRegisteredUser {
print("It is old user")
// We need to verify the receipt
return Service.sharedInstance.verifyReceipt()
.flatMap { verifiedUser in
print("Returning Verified new user [Verification Success]")
return Single.just((verifiedUser))

}.catchError{ error ->Single<User> in
print("Returning firstly created user [Verification Failed]")
print("Error Type: \(error)")
return Single.just(user)

}
} else {
//Normal anonymous old user
print("Returning firstly created user [Anonymous]")
return Single.just(user)
}
}
}

最佳答案

假设(因为我没有使用 Single 我将它们更改为 Observable ):

func createUserandVerify() -> Observable<User>
func getStuff() -> [Stuff]
func uploadStuff(_ user: User) -> Observable<String>

createUserandVerify()应该用 onError 发布错误所以uploadStuff如果出现问题,将不会被调用。

可能的解决方案:

enum CustomError: Error {
case instanceMissing
case notEnoughStuff
}

createUserandVerify()
.flatMap { [weak self] (user) -> Observable<String> in
guard let strongSelf = self else { throw CustomError.instanceMissing }
guard strongSelf.getStuff().count > 0 else { throw CustomError.notEnoughStuff }
return strongSelf.uploadStuff(user)
}
.subscribe(
onNext: { stringResult in
// print result from 'uploadStuff'
print(stringResult)
},
onError: { error in
// will be reached if something goes
// wrong in 'createUserandVerify' or 'uploadStuff'
// or if one of your custom errors in 'flatMap' are thrown
print(error)
})
.disposed(by: disposeBag)

你也可以制作getStuff通过返回 Observable 来响应或 Single并通过 flatMap 将其包含在链中.

关于swift - 使用 RxSwift 链接操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49831545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com