我必须从主服务器获取各种服务器列表,以维护正在运行的服务器信息。当某些正在运行的服务器关闭时,它将从正在运行的服务器列表中删除。
应用程序必须在应用程序启动时请求主api获取正在运行的服务器列表。当对正在运行的服务器的某些请求失败时,它必须请求主服务器刷新正在运行的服务器列表。
AFNetworking是异步的,如何在向运行的服务器发出请求之前完成主api的请求?如何使用异步api优雅地设计此逻辑:
1 failed to request to the running servers.
2 request the master to refresh the servers list.
3 try to request the running servers again.
答案 0 :(得分:1)
想法是利用块或委托来通知其他类有关更改,而不是让线程进入休眠状态。因为在这里使用块,我非常适合使用块。
此处提供的代码仅用于解释概念,并且复制粘贴可能永远不会起作用。
该怎么做:
我更喜欢为Web服务创建单例类,尽管它完全是可选的,取决于您的编码实践。
在一个单独的模型类中创建一个数组,您将创建该数组来保存当前正在运行的服务器的数组,或者在app delegate中有一个变量,以便所有类都可以访问它(最好有一个私有变量和为它写下setter和getter并公开它们然后由你决定在.h中声明属性。
在singleton类或appdelegate中有一个方法,它将completionblock作为参数,然后命中主服务器获取所有当前活动的服务器并在模型类中填充数组,然后调用完成块。
在firstViewController的ViewDidLoad或ViewWillAppear中,检查数组是否为nil如果是,则调用上面声明的方法并在完成时将完成块传递给它,完成块将涉及到它的时间调用你也会得到网址的aray。
每当url失败并且服务器似乎关闭时再次调用相同的方法并将完成块传递给它,重复上述相同的方法。
<强>代码强>
假设您正在使用AFNetworking更新版本并在此处使用块是代码。即使你使用代理approcah也是一样。
让我们假设你已经在appDelegate中编写了一个名为getActiveServers的方法,
-(void)getActiveServers:(void(^)(NSError *)) completionBlock {
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager POST:@"http://myURL.com/user" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
//process the response get the array
//save it in array variable
self.activeServerArray = [responseObject valueForKey:@"serverArray"];
if (completionBlock) {
completionBlock(nil);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
completionBlock(error);
}];
}
在进行webservice调用的yourViewControllers的viewDidLoad中,或者在任何创建webService类的类的开头,
在这里考虑ViewController的例子,
- (void)viewDidLoad {
[super viewDidLoad];
appdelegate=(AppDelegate *)[[UIApplication sharedApplication] delegate];
if(appDelegate.activeServerArray) {
//get the url you want and call your method to make webservice call
}
else {
[appdelegate getActiveServers:^(NSError *) {
if(error) {
//show alert fetching active server failed
}
else {
//call your method to make webservice call
}
}];
}
最后,如果发现服务器已关闭,则调用webservice的方法
-(void)myMethodToMakeWebServiceCall {
//realised server down
appdelegate=(AppDelegate *)[[UIApplication sharedApplication] delegate];
[appdelegate getActiveServers:^(NSError *) {
if(error) {
//show alert fetching active server failed
}
else {
//call the same method to fetch the data now with updated url
[self myMethodToMakeWebServiceCall];
}
}];
}