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 在另一个线程上发送请求,而您的应用程序仍然对用户交互保持响应。

一种简洁的方法是将完成块发送到该方法中,以便在 AFNetworkingsuccess 块中调用。将对 [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.
   }
}];