2015-06-18 1 views
1

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

- (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: returnResponse: error :. Я думаю, этого было бы достаточно в вашем случае

+0

Мне нужно проверить сертификаты сервера для привязки SSL, поэтому мне нужно использовать метод делегата. – Vaibhav

+0

В этом случае попробуйте установить очередь делегирования соединения 'setDelegateQueue:' Пусть эта очередь будет свойством вашего SyncCommunicationService –

+0

И уверены ли вы в этом '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Почему вы не используете dispatch_semaphore? Чем ваш метод sendSynchronousRequest: returnResponse: error: 'ничего не вернет, и данные ответа могут быть получены из свойства SyncCommunicationService (это то, что я делаю каждый раз, мне нужно получить данные асинхронно) –