我有一个方法(我们称它为 method1
),它向服务器 (POST) 发出异步请求以创建具有给定 ID 的 CommunicationLink 对象。在发送请求之前,该方法检查 CommunicationLink 是否已存在于服务器上。
我有第二种方法(我们称之为方法 2),它获取与给定 CommunicationLink ID 关联的“主题”对象列表。就像 method1
一样,method2
检查 CommunicationLink 是否已存在于服务器上,如果不存在,则创建它(同样,通过向服务器发送异步请求)。
我遇到的问题是,当我启动我的应用程序时,method1
和 method2
被一个接一个地调用,所以我最终得到这样的结果:
method1 checks if CommunicationLink exists ---> NO
method1 sends a request to create CommunicationLink (async call)
method2 checks if CommunicationLink exist ---> NO because the previous call is not done yet
method2 sends a request to create CommunicationLink
method1 done
method2 done
所以在服务器上,我最终得到了同一个 ID 的 2 个 CommunicationLinks(我无法控制服务器端发生的事情)
如果 method1
已经向服务器发送请求,“暂停”method2
的最佳方法是什么?我可以在调用 method1
之前将 bool 值设置为 true
并在请求完成后将其设置回 false
并且有一个 while (!myValue);
在 method2
中,但我觉得有更好的方法来做到这一点。
编辑
这段代码是我正在处理推送通知的静态库的一部分。我还在开发一个使用该库的测试应用程序。method1
在 - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken;
并且在我的 Root View 的 viewDidLoad
method2
方法一
- (void)sendProviderDeviceToken:(NSData *)deviceToken contextUUID:(NSString *)contextUUID sourceUUID:(NSString *)sourceUUID topicUUID:(NSString *)topicUUID language:(NSString *)language;
创建 CommLink 的方法
- (void)createCommunicationLinkWithSuccessHandler:(void (^)(NSNumber *))successHandler errorHandler:(void (^)(NSError *))errorHandler;
方法2
- (void)retrieveSubscriptionForContext:(NSString *)contextUUID notificationTopic:(NSString *)notificationTopic completion:(void (^)(NSDictionary *))completion;
我希望能够直接在我的库中处理这种情况,而不必修改我的测试应用程序。 method1
和 method2
在同一线程上调用。
谢谢
最佳答案
这里的要点是你是如何处理的:
“方法1发送创建CommunicationLink的请求(异步调用)”
你应该在那里提供某种回调。然后回调将执行/触发第二步。
如果您正在使用 NSURLResponse/Connection 或其他网络框架(AFNetworking 等),您将可以使用此类回调机制(这将采用某种委托(delegate)方法的形式,或者您传递给网络请求)。请提供更多详细信息以获取更多信息。
另一种方法是让您在单独的线程上管理工作流方法 1/方法 2,这样您就可以等待而不会阻塞 UI,但这会复杂得多。
编辑:
你可以使用你的
(^)(NSNumber *))successHandler
方法 1 的参数以链接方法 2 的执行。
或者,您可以执行以下操作:
在运行
method1
时,设置一个标志,表明您的应用正在等待响应;收到响应时(即在
successHandler
或errorHandler
中),重置标志;在
viewDidLoad
中,在运行method2
之前,检查标志的状态,只有在您不等待时才执行method2
寻求回应。
您需要创建某种可从委托(delegate)和 View Controller 访问的状态信息。
希望对您有所帮助。
编辑 2:
考虑到您可以在第一个网络请求完成之前加载您的 View Controller ,我建议这样做:
将
viewDidLoad
分解为method2
网络请求及其进一步处理(因此您可以从viewDidLoad
内部和外部调用它们的);将上面定义的方法注册为
NSNotificationCenter
通知的观察者;在
viewDidLoad
中,如果method1网络请求还在进行中,则不要调用第1步定义的方法;当您从您的应用程序委托(delegate)中调用
method1
时,让successHandler
发布一个通知,以便任何相关方都知道第一个连接已经建立;4b。感谢在第 2 步注册的通知观察者,您的 View Controller 将能够更新其状态(并最终调用
method2
)。
这需要对您的应用进行一些更改;即,您的 View Controller 将需要支持“离线”模式,在该模式下它无法执行 method2
并根据整体状态向用户显示一些信息:无网络、等待响应、无响应、等等
关于objective-c - 在继续之前等待 bool 值发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15115068/