我正在开发一个主要与将安装在内部系统中的 API 一起使用的应用程序。API 也可以通过公共互联网访问。客户端希望允许用户输入内部和外部(公共互联网)URL,然后应用程序将根据内部和外部 URL 的可用性连接到该 URL。
该应用程序基本上已完成,但它当前仅针对其所有 API 调用连接到内部 URL。我将 AFNetworking 与每个 API 调用的基于块的完成/失败调用一起使用。
根据我们设计的逻辑,应用程序将始终通过查询服务器的当前时间来检查 API 的可用性。这是通过调用来完成的http://internal_url/api/time
。如果此 API 未能返回适当的响应,我们将切换到外部 URLhttp://external_url/api/time
并在该 URL 上调用相同的 API。如果两者都失败,应用程序将相应地通知用户,并且不对 API 执行任何其他查询。
在不透露太多信息的情况下,这里有一些关于我当前如何设置 API 调用的代码:
- (void)someAPIMethodCall:(NSDictionary *)parameters completionBlock:block failure:block {
// query /api/time and return the URL (internal/external) that is currently up
AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:<url returned from above query>];
[client operationWithSuccess:block failure:block];
}
所以我的问题是:让/api/time
上面的查询方法起作用的最佳方法是什么?显然,此方法需要完成并返回内部/外部 URL,以便后续实际 API 查询可以使用。AFAIK,AFNetworking 调用是基于块的,因此它将在上述返回之前/api/time
返回。我还想到了一个单独的类,它同步使用 NSURLConnection ,它会在等待/api/time
返回时阻塞主线程。