这种情况下如何使用AFNetworking?
How to use AFNetworking in this situation?
我必须从维护 运行 服务器的主服务器获取各种服务器列表 info.When 一些 运行 服务器已关闭,它将从 运行 服务器列表。
当应用程序 starts.When 对 运行 服务器的某些请求失败时,应用程序必须请求主 api 获取 运行 服务器列表,它必须请求主人刷新运行服务器列表。
AFNetworking是异步的,如何让masterapi的请求先于运行server请求完成?如何用异步 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.
想法是利用块或委托来通知其他 classes 有关更改,而不是让线程休眠。因为我对积木非常满意所以我在这里使用积木。
此处提供的代码仅用于解释概念,复制粘贴可能无效。
怎么办:
我更喜欢为 Web 服务创建单例 class 尽管它完全是可选的并且取决于您的编码实践。
在单例模型 class 中有一个数组,您将创建它来保存当前 运行 服务器的数组,或者在应用程序委托中有一个变量,以便它可以由所有 classes 访问(最好有一个私有变量并为它编写 setter 和 getter 并使它们成为 public 但随后由您声明 属性 在 .h 中)
在单例 class 或 appdelegate 中有一个方法,它将完成块作为参数并将命中主服务器获取所有当前活动的服务器并填充模型中的数组 class 然后调用完成块。
在您的第一个 ViewController 的 ViewDidLoad 或 ViewWillAppear 中检查数组是否为 nil 如果是则调用上面声明的方法并在完成完成块时将完成块传递给它将参与其中,并且在调用它时,您还将拥有 url 的数组。
每当 url 失败并且服务器似乎已关闭时再次调用相同的方法并将完成块传递给它重复上述相同的方法。
代码
假设您正在使用 AFNetworking 更新版本并使用块,这里是代码。即使您使用委托方法也是一样的。
假设您在 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);
}];
}
在进行网络服务调用的ViewControllers 的 viewDidLoad 中或在任何class 进行网络服务class 的开头,
考虑到这里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
}
}];
}
最后在您发现服务器已关闭时调用网络服务的方法中,
-(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];
}
}];
}
我必须从维护 运行 服务器的主服务器获取各种服务器列表 info.When 一些 运行 服务器已关闭,它将从 运行 服务器列表。
当应用程序 starts.When 对 运行 服务器的某些请求失败时,应用程序必须请求主 api 获取 运行 服务器列表,它必须请求主人刷新运行服务器列表。
AFNetworking是异步的,如何让masterapi的请求先于运行server请求完成?如何用异步 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.
想法是利用块或委托来通知其他 classes 有关更改,而不是让线程休眠。因为我对积木非常满意所以我在这里使用积木。
此处提供的代码仅用于解释概念,复制粘贴可能无效。
怎么办:
我更喜欢为 Web 服务创建单例 class 尽管它完全是可选的并且取决于您的编码实践。
在单例模型 class 中有一个数组,您将创建它来保存当前 运行 服务器的数组,或者在应用程序委托中有一个变量,以便它可以由所有 classes 访问(最好有一个私有变量并为它编写 setter 和 getter 并使它们成为 public 但随后由您声明 属性 在 .h 中)
在单例 class 或 appdelegate 中有一个方法,它将完成块作为参数并将命中主服务器获取所有当前活动的服务器并填充模型中的数组 class 然后调用完成块。
在您的第一个 ViewController 的 ViewDidLoad 或 ViewWillAppear 中检查数组是否为 nil 如果是则调用上面声明的方法并在完成完成块时将完成块传递给它将参与其中,并且在调用它时,您还将拥有 url 的数组。
每当 url 失败并且服务器似乎已关闭时再次调用相同的方法并将完成块传递给它重复上述相同的方法。
代码
假设您正在使用 AFNetworking 更新版本并使用块,这里是代码。即使您使用委托方法也是一样的。
假设您在 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);
}];
}
在进行网络服务调用的ViewControllers 的 viewDidLoad 中或在任何class 进行网络服务class 的开头,
考虑到这里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
}
}];
}
最后在您发现服务器已关闭时调用网络服务的方法中,
-(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];
}
}];
}