AFnetworking 在 objective C 同步
AFnetworking synchronise in objective C
我创建了一个 class 服务器管理器来处理所有服务器通信内容,其中包括 AFnetworking 文件。
实例是这样分配的,可以操作GET或者POST请求。
+ (ServerManager*) instance
{
static ServerManager *Instance = nil;
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
Instance = [[ServerManager alloc]init];
});
return Instance;
}
但是我的问题是,什么时候我想从class之外的服务器得到响应?我怎样才能以同步方式实现它?
例如,在我的视图控制器中:
ServerManager *serverManager = [ServerManager instance];
然后我在 ServerManager 中调用了 class 方法用于 post 请求 returns 一个 int.
int i = [serverManager postOperation:params];
变量"i"
未赋值,调用下一条语句。然后服务器在几秒钟后返回响应。
如何在此处获得同步方式以将服务器响应分配给本地?
在 class 方法中,我调用了:
[AFHTTPRequestOperationManager POST:url parameters:params
success^(AFHTTPRequestOperation *operation, id responseObject){
....;
}failure^(AFHTTPRequestOperation *operation, NSError *error){
....;
}
所以这里发生的事情是 AFNetworking
在另一个线程上发送服务器 POST
请求,然后在 int i = [serverManager postOperation:params];
之后继续执行您实际上不想block/stop 所有行为(即:使其同步)直到服务器 returns 响应并将其分配给 int i
,因为这会导致应用程序无响应,并给用户带来令人沮丧的体验,所以执行移到下一行的事实是可取的。您希望允许 AFNetworking
在另一个线程上发送请求,而您的应用程序仍然对用户交互保持响应。
一种简洁的方法是将完成块发送到该方法中,以便在 AFNetworking
的 success
块中调用。将对 [AFHTTPRequestOperationManager POST:url parameters:params....
的调用包装在一个方法中,然后调用它。
例如:
- (void)registerUserWithCompletion:(void (^)(NSArray *results))completion
{
[AFHTTPRequestOperationManager POST:url parameters:params success^(AFHTTPRequestOperation *operation, id responseObject){
NSArray *results = [responseObject valueForKey:@"results"];
if(completion){
completion(results);
}
} failure^(AFHTTPRequestOperation *operation, NSError *error){
if(completion){
NSLog(@"Error: %@", error);
completion(nil); // send nil to indicate the call has failed for some reason.
}
}];
}
然后像这样调用该方法:
[self registerUserWithCompletion:^(NSArray *results) {
if (results.count > 0) {
// API call was successful. Do something with the results.
NSNumber *i = [results objectAtIndex:0];
// Do something with that variable.
}
}];
我创建了一个 class 服务器管理器来处理所有服务器通信内容,其中包括 AFnetworking 文件。
实例是这样分配的,可以操作GET或者POST请求。
+ (ServerManager*) instance
{
static ServerManager *Instance = nil;
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
Instance = [[ServerManager alloc]init];
});
return Instance;
}
但是我的问题是,什么时候我想从class之外的服务器得到响应?我怎样才能以同步方式实现它?
例如,在我的视图控制器中:
ServerManager *serverManager = [ServerManager instance];
然后我在 ServerManager 中调用了 class 方法用于 post 请求 returns 一个 int.
int i = [serverManager postOperation:params];
变量"i"
未赋值,调用下一条语句。然后服务器在几秒钟后返回响应。
如何在此处获得同步方式以将服务器响应分配给本地?
在 class 方法中,我调用了:
[AFHTTPRequestOperationManager POST:url parameters:params
success^(AFHTTPRequestOperation *operation, id responseObject){
....;
}failure^(AFHTTPRequestOperation *operation, NSError *error){
....;
}
所以这里发生的事情是 AFNetworking
在另一个线程上发送服务器 POST
请求,然后在 int i = [serverManager postOperation:params];
之后继续执行您实际上不想block/stop 所有行为(即:使其同步)直到服务器 returns 响应并将其分配给 int i
,因为这会导致应用程序无响应,并给用户带来令人沮丧的体验,所以执行移到下一行的事实是可取的。您希望允许 AFNetworking
在另一个线程上发送请求,而您的应用程序仍然对用户交互保持响应。
一种简洁的方法是将完成块发送到该方法中,以便在 AFNetworking
的 success
块中调用。将对 [AFHTTPRequestOperationManager POST:url parameters:params....
的调用包装在一个方法中,然后调用它。
例如:
- (void)registerUserWithCompletion:(void (^)(NSArray *results))completion
{
[AFHTTPRequestOperationManager POST:url parameters:params success^(AFHTTPRequestOperation *operation, id responseObject){
NSArray *results = [responseObject valueForKey:@"results"];
if(completion){
completion(results);
}
} failure^(AFHTTPRequestOperation *operation, NSError *error){
if(completion){
NSLog(@"Error: %@", error);
completion(nil); // send nil to indicate the call has failed for some reason.
}
}];
}
然后像这样调用该方法:
[self registerUserWithCompletion:^(NSArray *results) {
if (results.count > 0) {
// API call was successful. Do something with the results.
NSNumber *i = [results objectAtIndex:0];
// Do something with that variable.
}
}];