objective-c - 在继续之前等待 bool 值发生变化

标签 objective-c asynchronous

我有一个方法(我们称它为 method1),它向服务器 (POST) 发出异步请求以创建具有给定 ID 的 CommunicationLink 对象。在发送请求之前,该方法检查 CommunicationLink 是否已存在于服务器上。

我有第二种方法(我们称之为方法 2),它获取与给定 CommunicationLink ID 关联的“主题”对象列表。就像 method1 一样,method2 检查 CommunicationLink 是否已存在于服务器上,如果不存在,则创建它(同样,通过向服务器发送异步请求)。

我遇到的问题是,当我启动我的应用程序时,method1method2 被一个接一个地调用,所以我最终得到这样的结果:

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;

我希望能够直接在我的库中处理这种情况,而不必修改我的测试应用程序。 method1method2 在同一线程上调用。

谢谢

最佳答案

这里的要点是你是如何处理的:

“方法1发送创建CommunicationLink的请求(异步调用)”

你应该在那里提供某种回调。然后回调将执行/触发第二步。

如果您正在使用 NSURLResponse/Connection 或其他网络框架(AFNetworking 等),您将可以使用此类回调机制(这将采用某种委托(delegate)方法的形式,或者您传递给网络请求)。请提供更多详细信息以获取更多信息。

另一种方法是让您在单独的线程上管理工作流方法 1/方法 2,这样您就可以等待而不会阻塞 UI,但这会复杂得多。

编辑:

你可以使用你的

(^)(NSNumber *))successHandler

方法 1 的参数以链接方法 2 的执行。

或者,您可以执行以下操作:

  1. 在运行 method1 时,设置一个标志,表明您的应用正在等待响应;

  2. 收到响应时(即在successHandlererrorHandler 中),重置标志;

  3. viewDidLoad 中,在运行 method2 之前,检查标志的状态,只有在您不等待时才执行 method2寻求回应。

您需要创建某种可从委托(delegate)和 View Controller 访问的状态信息。

希望对您有所帮助。

编辑 2:

考虑到您可以在第一个网络请求完成之前加载您的 View Controller ,我建议这样做:

  1. viewDidLoad 分解为 method2 网络请求及其进一步处理(因此您可以从 viewDidLoad 内部和外部调用它们的);

  2. 将上面定义的方法注册为 NSNotificationCenter 通知的观察者;

  3. viewDidLoad中,如果method1网络请求还在进行中,则不要调用第1步定义的方法;

  4. 当您从您的应用程序委托(delegate)中调用method1 时,让successHandler 发布一个通知,以便任何相关方都知道第一个连接已经建立;

    4b。感谢在第 2 步注册的通知观察者,您的 View Controller 将能够更新其状态(并最终调用 method2)。

这需要对您的应用进行一些更改;即,您的 View Controller 将需要支持“离线”模式,在该模式下它无法执行 method2 并根据整体状态向用户显示一些信息:无网络、等待响应、无响应、等等

关于objective-c - 在继续之前等待 bool 值发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15115068/

相关文章:

javascript - 如何正确构建异步 Node 代码

javascript - 异步数组问题

node.js - Mongoose 无法将新对象推送到父数组

ios - TableView 框架显示在意外位置

ios - 没有从 didSelectRowAtIndexPath splitviewController 调用 ViewDidLoad

ios - CIfilter中过滤值的最佳范围

python - Python 中的自定义协程

objective-c - 从您的应用程序启动 Facetime?

iphone - 如何访问已在ApplicationDelegate 中初始化的对象?

python - 异步等待对象 - 基本示例