Получить ответ NSURLConnection (из вспомогательного класса) внутри метода другого класса

У меня есть класс «WebAPI», который обрабатывает все вызовы веб-API, класс использует NSURLConnection через свои асинхронные вызовы на основе делегатов.

Всякий раз, когда объект должен связываться с веб-API, он будет использовать экземпляр WebAPI и вызывать требуемый метод, как показано ниже, в случае входа в систему. Я делаю следующий вызов из AppDelegate:

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

Проблема заключается в том, что после выполнения вызова executeLoginWithUserName: 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-коды.

Какой был бы лучший способ выполнить это требование?

Спасибо за помощь.

  • OpenSSL «Сервер« localhost »требует сертификата клиента.»: IOS 8 с сервером apache localhost
  • NSURLSession и NSDefaultRunLoopMode
  • Неисправность памяти NSURLConnection?
  • NSURLConnection растет в инструментах, это NSURLCache?
  • Как использовать возможности iOS
  • Как проверить Response.statusCode в sendSynchronousRequest на Swift
  • Использование NSURLConnection с действительным сертификатом SSL в Swift
  • Унифицирующая оболочка NSURLConnection, реализованная с помощью семафоров
  • 2 Solutions collect form web for “Получить ответ NSURLConnection (из вспомогательного класса) внутри метода другого класса”

    Вы можете использовать блоки для обработки ответов. Например:

     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 чтобы предоставить собственный интерфейс делегата, или использовать блоки завершения в запросе, вызываемые при завершении асинхронного подключения.

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.