Ios 在不同的API主机之间切换

Ios 在不同的API主机之间切换,ios,objective-c,cocoa-touch,block,afnetworking,Ios,Objective C,Cocoa Touch,Block,Afnetworking,我正在开发一个应用程序,它主要与将安装在内部系统中的API一起工作。该API也可通过公共互联网访问。客户端希望允许用户输入内部和外部(公共互联网)URL,然后应用程序将根据内部和外部URL的可用性连接到该URL 该应用程序基本上是完成的,唯一的例外是它当前仅为所有API调用连接到内部URL。我正在使用AFNetworking,对每个API调用进行基于块的完成/失败调用 根据我们设计的逻辑,应用程序将始终通过查询服务器的当前时间来检查API的可用性。这是通过调用http://internal_ur

我正在开发一个应用程序,它主要与将安装在内部系统中的API一起工作。该API也可通过公共互联网访问。客户端希望允许用户输入内部和外部(公共互联网)URL,然后应用程序将根据内部和外部URL的可用性连接到该URL

该应用程序基本上是完成的,唯一的例外是它当前仅为所有API调用连接到内部URL。我正在使用AFNetworking,对每个API调用进行基于块的完成/失败调用

根据我们设计的逻辑,应用程序将始终通过查询服务器的当前时间来检查API的可用性。这是通过调用
http://internal_url/api/time
。如果此API未能返回适当的响应,我们将切换到外部URL
http://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];
}
-(void)someAPIMethodCall:(NSDictionary*)参数completionBlock:块故障:块{
//查询/api/time并返回当前打开的URL(内部/外部)
AFHTTPClient*client=[AFHTTPClient-clientWithBaseURL:];
[客户端操作成功:阻塞失败:阻塞];
}

所以我的问题是:让上面的查询
/api/time
方法工作的最佳方法是什么?显然,此方法需要完成并返回内部/外部URL,以便后续实际API查询可以使用。AFAIK,AFNetworking调用是基于块的,因此它将在上述
/api/time
返回之前返回。我还想到了一个单独的类,它同步使用NSURLConnection,在等待
/api/time
返回时阻塞主线程

我想告诉您只需在内部和外部(通过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.
}

一旦您确定了
内部url
外部url
,在应用程序的生命周期内,这种情况会发生变化吗?@AaronBrager因为我们最好连接到内部托管的API,我们的逻辑是检查系统时间,并在时间点切换回使用
内部url
。P/S:我没有想到这个逻辑,客户想到了。谢谢!我遵循了这个方法,目前正在成功地实现它。