- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用程序中,我正在使用Moya和RxSwift进行Web服务调用。这些调用是异步的,可以在新数据可用时由用户交互以及远程通知触发。
每个Web服务调用都需要在其 header 中进行身份验证。当用户更改密码时,将通过更改密码Web服务调用重新生成并返回 token 。
现在,当用户更改密码时,可能会发生远程通知并导致另一个Web服务调用。根据服务器的负载以及系统处理不同线程的方式,理论上可能发生以下情况:该调用是在另一个调用检索到新 token 之前,而服务器已经使旧 token 无效之后进行的。结果是HTTP 401未授权错误。
我想避免这种情况,但是我不确定最好的方法是什么,或者我的想法有误。
我发现此页面讨论锁,互斥锁和信号灯:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html
似乎我应该这样使用“读写锁”:
最佳答案
我想分享一些关于 RxSwift 中的内置机制的想法。我认为有一些方法可以实现所需的行为。
The code below is just a theory and hasn't been tested. Please, don't cmd+c cmd+v this code. Its purpose is to show the simplified version of potential solution.
var activityIndicator = ActivityIndicator()
var relayToken = BehaviorRelay<String?>(value: nil)
ActivityIndicator
是
this struct,这有助于捕获多个
Observables
的 Activity 。
func request<D, P, R>(data: D, parameters: @escaping (D, String) -> P, response: @escaping (P) -> Observable<R>) -> Observable<R> {
return Observable
.just(data)
.flatMap({ (data: D) -> Observable<R> in
return relayToken
.asObservable()
.filterNil()
.take(1)
.map({ parameters(data, $0) })
.flatMap({ (parameters: P) -> Observable<R> in
return activityIndicator.trackActivity(response(parameters))
})
})
}
data: D
-初始请求参数
parameters: @escaping (D, String) -> P
-将带有 token 的初始参数转换为完整请求参数的闭包。
response: @escaping (P) -> Observable<R>
-将完整参数转换为正确请求
Observable
的闭包。这是使用
Moya 或其他某种机制的地方。
Observable
,也由
activityIndicator
跟踪。需要进行此类跟踪才能知道何时完成所有“读取”调用。
func update(token: String?) {
_ = Observable
.just(token)
.flatMap({ (token: String?) -> Observable<String?> in
return activityIndicator
.asObservable()
.filter({ $0 == false })
.take(1)
.map({ _ in token })
})
.bind(to: relayToken)
}
activityIndicator
进行跟踪。
relayToken = nil
。activityIndicator
将再次提供帮助)relayToken = some
relayToken.asObservable().filterNil().take(1)
nil
-等待。如果不是
nil
,则只能进行一次。
关于ios - iOS Moya Web服务: make one call wait for all others to finish,然后阻止新调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48218770/
这两者有区别吗? startActivity(intent); finish(); startActivity(intent); ThisActivityName.this.finish(); 注意:
我有一个包含大量 url 链接的 arrayOfLinks。我需要从这些链接中获取图像。我正在使用以下代码来执行此操作。 - (void)getImages { NSArray *links
我想创建一条执行以下步骤的路线 读取文件 将文件分割成行 使用 BeanIO 解码行 调用(昂贵且耗时的)处理器 我想在处理完所有线路后完成这条路线。 所以我的路线的基本布局如下所示: from("d
我正在使用 Nodejs。我有一个异步的 forEach,因为我必须在 forEach 中等待结果。结果,我需要等待 forEach 完成,然后继续处理循环的结果。我找到了几种等待 forEach 的
我正在编写需要背靠背内核调用的 android renderscript 代码(有时一个内核的输出成为另一个内核的输入)。我还有一些全局指针,绑定(bind)到 Java 层的内存。每个内核更新那些全
伪代码: void draw() { Vertex* vertices = scene.GetVertexArray(); glEnableClientState(...);
当我创建一个 Android 应用程序时,我首先在其中创建了主 Activity ,然后添加了启动 Activity 以及一个正常 Activity 。 所以我的问题是每当我在应用程序中单击退出时,它
我正在尝试将一些 API 数据获取到我的应用程序,并且我有两个 Activity 。第一个是启动屏幕(就像加载应用程序时谷歌使用的那样),我想知道在哪里调用 finish() 来结束 Activity
我使用 创建了“新文件” Activity startActivityForResult(new Intent(MainActivity.this, NewFile.class),1); NewFil
我有一个以 SingleTask 模式 (Android 2.2) 运行的 Activity ,该 Activity 从其他 Activity 或服务接收 Intent 。我的 Activity 将每
我编写了以下代码来使用 TextView 和按钮显示消息框。单击按钮时, Activity 应该完成。但这有时会起作用,但并不一致。有时它会挂起。如何让它始终如一地工作?请帮忙 public clas
我正在搜索,当 onDestroy 在 android 应用程序上执行时,我发现它是在设备资源不足(RAM、CPU) 时执行的,并且当用户调用 finish() 时。 例如,当我按下后退按钮从一个 A
我正在编写一个 Android 应用程序,它显示一个带有一些元素和一些 CRUD 操作的 RecyclerView。我想做的一件事是从我的 RecyclerView 更新现有元素,为此我打开一个新 A
被测试的 Activity 是一个简单的棋盘游戏。当满足游戏结束的必要条件时,在执行几项操作以显示谁赢了等之后,将运行以下代码: // Return to main menu after 5 seco
我有一个 Activity ,它创建了我创建的名为classA的类的新实例。在classA中,我有一个方法将对象添加到位于classA中的STATICarrayList。 所以我的 Activity
我正在使用 Facebook Android SDK,并希望在用户登录并获取用户对象后关闭我的 Activity。实际上,我存储了它的一部分,但无论如何我都想关闭该 Activity 。
我以前从事c# dotnet开发,有一个Application.exit()类型的方法,可以立即关闭应用程序并释放内存。 我发现 android 的“finish()”方法应该这样做 但它没有这样做,
我有一个 Activity ,我调用了 finish() 方法,但 Activity 没有从内存中清除。 调用 finish() 后,我看到方法 onDestroy() 已成功执行(并且我清除了其中的
我想在我的MKMapView上设置一个区域,然后找到与 map 的东北角和西南角对应的坐标。 This code works just fine to do that: //Recenter and
我正在尝试使用从顶部滑动动画将一个 View 替换为另一个 View 。我有点遵循 http://gentlebytes.com/2011/09/auto-layout-in-lion/ 中发布的指南
我是一名优秀的程序员,十分优秀!