NSUrlConnection Методы делегата не вызываются из вспомогательного класса.

Я должен сделать закрепление SSL, поэтому необходимо проверить сертификат SSL на стороне сервера. Так что я должен использовать NSURL делегатов. У меня есть вспомогательный класс, в котором я создал метод, который возвращает мне ответ входа в систему:

- (NSData *)sendSynchronousRequest:(NSString *)strNewLoginRequest
             returningResponse:(NSURLResponse **)response
                         error:(NSError **)error {
NSMutableURLRequest *finalRequest = nil;

NSURL *url= [NSURL URLWithString:const_url];

finalRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0];

NSData *requestData = [NSData dataWithBytes:[strLoginRequest UTF8String] length:[strLoginRequest length]];

    self.connection = [[NSURLConnection alloc] initWithRequest:finalRequest delegate:self startImmediately:NO];

    NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
    [self.connection unscheduleFromRunLoop:currentRunLoop forMode:NSDefaultRunLoopMode];
    [self.connection scheduleInRunLoop:currentRunLoop forMode:@"connectionRunLoopMode"];

    [self.connection start];

    while ([currentRunLoop runMode:@"connectionRunLoopMode" beforeDate:[NSDate distantFuture]]);

    return self.mutableResponse;
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    self.response = response;
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    self.mutableResponse = [[NSMutableData alloc]init];
    [self.mutableResponse appendData:data];

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    dispatch_async(dispatch_get_main_queue(), ^{

    if (loadingView)
    {
        [loadingView removeView];
    }

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Failure" message:@"Network Failure" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];

        [alert show];
    });
}

 - (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    if (loadingView)
    {
        [loadingView removeView];
    }
    self.resultString = [[NSString alloc] initWithData:self.mutableResponse      encoding:NSASCIIStringEncoding];
}

и я вызываю этот метод из другого класса с именем ViewController с кодом

-(void)doLogin
{
 self.service = [[SyncCommunicationService alloc]init];
 NSData *data = [self.service sendSynchronousRequest:strNewLoginRequest
                                  returningResponse:&response
                                              error:nil];
}

Я пытался вызвать этот метод в фоновом режиме и в главном потоке, но методы делегатов по-прежнему не вызывались, я пробовал многие другие ответы с того же сайта, но все еще не смог решить эту проблему, поэтому, пожалуйста, кто-нибудь может понять, что я делаю неправильно.

1 ответ

Решение

Мне интересно, зачем кому-то использовать асинхронный запрос для синхронного выполнения задачи? Не говоря уже об этом странном способе ожидания с оператором while вместо dispatch_semaphore или чем-то подобным.

Однако, почему Вы вообще беспокоитесь о делегате? Просто используйте метод класса sendSynchronousRequest:returningResponse:error:. Я думаю, этого было бы достаточно в вашем случае

Другие вопросы по тегам