Ios 在另一个类的方法内获取NSURLConnection响应(来自帮助器类)
我有一个类“WebAPI”,它处理所有web API调用,该类通过基于异步委托的调用使用NSURLConnection 每当对象需要与web API通信时,它将使用WebAPI实例并调用所需的方法,如下所示。在登录的情况下,我从AppDelegate进行以下调用:Ios 在另一个类的方法内获取NSURLConnection响应(来自帮助器类),ios,objective-c,macos,nsurlconnection,Ios,Objective C,Macos,Nsurlconnection,我有一个类“WebAPI”,它处理所有web API调用,该类通过基于异步委托的调用使用NSURLConnection 每当对象需要与web API通信时,它将使用WebAPI实例并调用所需的方法,如下所示。在登录的情况下,我从AppDelegate进行以下调用: - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { WebAPI *webAPI = [[WebAPI alloc] init];
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
WebAPI *webAPI = [[WebAPI alloc] init];
[webAPI performLoginWithUserName:@"test1@myserver.com" andPassword:@"password"];
}
问题在于,一旦调用performLoginWithUserName:andPassword,代码就会继续进行,并且在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
类,以提供自己的委托接口,或对请求使用完成块,在异步连接完成时调用完成块。您可以使用块来处理响应。
例如:
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
在您的WebAPI
仍在处理请求时立即准备就绪。在我看来,更明智的解决方案是在WebAPI
类中添加对委托对象的支持…不是立即,我确实理解,做我需要做的事情需要NSURLConnection来完成并接收响应和数据,我曾经考虑过实现委托,但这只允许我在调用类而不是调用方法中接收响应。响应/数据需要在进行webAPI调用的方法中使用。然后需要更改该方法。将功能移动到另一个方法。在用户等待时向其显示活动指示器+取消按钮。您不应该使用同步调用。在这种情况下,块肯定包含对定义它们的方法范围的引用。这看起来很有希望!我会试一试,然后再给你回复!非常感谢。