在另一个类的方法内获得NSURLConnection响应(来自助手类)

我有一个类,“WebAPI”,处理所有的Web API调用,类使用NSURLConnection通过其基于asynchronous委托的调用。

每当一个对象需要与Web API进行通信,它将使用WebAPI的一个实例,并在login的情况下调用所需的方法,如下所示从AppDelegate进行以下调用:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { WebAPI *webAPI = [[WebAPI alloc] init]; [webAPI performLoginWithUserName:@"test1@myserver.com" andPassword:@"password"]; } 

问题是一旦执行了performLoginWithUserName:和Password调用,代码就会继续,并且在WebAPI.m中实现的委托方法中接收到任何/所有响应。

这是一个真正的问题,因为我需要能够获得响应代码以及从WebAPI调用所源自的类方法中接收到的任何数据。 我想能够这样做:

 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { WebAPI *webAPI = [[WebAPI alloc] init]; WebAPIResponse * webAPIRespnse = [webAPI performLoginWithUserName:@"test1@myserver.com" andPassword:@"password"]; } 

WebAPIResponse类是一个自定义类,其中将包含HTTP状态代码和接收到的任何数据。

这是可以实现的,如果我更改WebAPI.m使用NSURLConnection sendSynchronousRequest,但不能让我接收所有的HTTP代码。

满足这个要求的最好方法是什么?

感谢您的帮助。

你可以使用块来处理响应。 例如:

 WebApi.h - (void)performLoginWithUsername:(NSString *)userName andPassword:(NSString *)password successBlock:(void(^)(NSData *response))successBlock failureBlock:(void(^)(NSError *error))failureBlock; WebApi.m @interface WebAPI() @property (nonatomic, copy) void(^authorizationSuccessBlock)(NSData *response); @property (nonatomic, copy) void(^authorizationFailureBlock)(NSError *error); @end @implementation WebAPI - (void)performLoginWithUsername:(NSString *)userName andPassword:(NSString *)password successBlock:(void(^)(NSData *response))successBlock failureBlock:(void(^)(NSError *error))failureBlock { self.authorizationSuccessBlock = successBlock; self.authorizationFailureBlock = failureBlock; // NSURLConnection call for authorization here } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { if (self.authorizationSuccessBlock != nil) { self.authorizationSuccessBlock(data); self.authorizationSuccessBlock = nil; } } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { if (self.authorizationFailureBlock != nil) { self.authorizationFailureBlock(error); self.authorizationFailureBlock = nil; } } AppDelegate.m - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { WebAPI *webAPI = [[WebAPI alloc] init]; [webAPI performLoginWithUserName:@"test1@myserver.com" andPassword:@"password" successBlock:^(NSData *response) { // Handle result here } failureBlock:^(NSError *error) { // Handle error here }]; 

}

更改WebAPI类以提供自己的委托接口,或者在asynchronous连接完成时调用请求上的完成块。