0

我正在开发一个主要与将安装在内部系统中的 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返回时阻塞主线程。

4

1 回答 1

1

我想告诉您在内部和外部(通过 DNS)简单地使用相同的 URL,但这不是您想要的。

我想你是在问如何有条件地调用另一个 url。

您希望 someAPIMethodCall 是异步的...因此您不想阻止调用以检查要调用的正确 api。

除了缓存结果以便您不必每次都这样做之外,您只需调用您自己的另一个基于块的方法,该方法具有一个完成块,该完成块将输入 URL 的参数以调用您的实际查询。

- (void)someAPIMethodCall:(NSDictionary *)parameters completionBlock:(void (^)(void))succesBlock failure((^)(void)):failureBlock {
    [self callBlockWithMyApiUrl:^(NSString *apiUrl){
        AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:apiUrl];
        [client operationWithSuccess:successBlock failure:failureBlock];
    } onFailure:^{
        failureBlock
    }
}

- (NSString *)callBlockWithMyApiUrl:(NSString * (^)(void))success (void (^)(void))failure
{
    // Your code to test for the working URI
    // If you're doing it this way, I'd suggest caching the result.
    // Subscribe to networking interface changes to dump the cache.
}
于 2013-07-15T19:11:44.367 回答