2013-06-29 3 views
0

Я знаю, что люди спрашивали об этом, но я не нашел удовлетворительных ответов. У меня есть один метод, через который я отправляю все свои URLRequests. Я возвращаю ответ запроса как строку, когда метод завершается. Недавно я добавил ssl в свою программу. Это означает, что я больше не могу использовать синхронный запрос, потому что мне нужно использовать функцию didReceiveAuthenticationChallenge, так как мои учетные данные в настоящее время самоподписываются. Программе требуется ответ от URL-адреса, чтобы продолжить, чтобы в ожидании ответа не было вреда. Однако я не могу найти способ просто сохранить код и продолжить его после завершения. Я могу предупредить исходную функцию, вызвавшую функцию запроса, но мне хотелось бы, чтобы программа сразу забирала ее. И у него есть уникальный код ниже таких вызовов, поэтому я не могу специализировать функцию connectionDidFinishLoading: потому что каждый метод, который называет это, отличается.Как приостановить программу до завершения nsurlconnection?

Как я могу приостановить программу, чтобы я мог вернуть nsdata из соединения методам, которые его вызвали?

Вот некоторые псевдо-код, чтобы показать вам, что я имею в виду:

- (void) login:(NSString *)username :(NSString *)password { 
    NSString *str = [NSString stringWithFormat:%@"%@:::%@",username,password]; 
    NSURL *url = [NSURL urlWithString:@"https://blahblahblah"]; 
    NSString *result = [self connectToUrl:str:url]; 
    if ([result isEqualToString:@"valid"]) { 
      //this would be more complex in here 
      NSLog(@"hooray"); 
    } else { 
      NSLog(@"bummer"); 
    } 
} 


- (NSString *)connectToUrl:(NSURL *)url :(NSString *)str { 

    NSData *FileData = [str dataUsingEncoding: NSUTF8StringEncoding]; 



    NSMutableData *data = [[NSMutableData alloc] initWithCapacity:100]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
    [request setHTTPMethod:@"POST"]; 

    //set up the rest of the request... 

    ... 

    connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
    [connection start]; 

    //WOULD LIKE TO PAUSE HERE UNTIL COMPLETE! THEN CONTINUE 

    // received data is assigned in didReceiveData: method 
    return [[[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding] autorelease]; 

} 

Но, увы, я не могу этого сделать, потому что я не могу сделать окончательный ждать линии, пока соединение не будет завершено ... Пожалуйста, помогите мне !

Очень благодарен!

R

ответ

3

IOS и OS X и много сенсорных структур какао/какао построены на модели событий. Вы не приостанавливаете свое приложение. Это не правильный подход. Вам нужно запустить соединение, а затем продолжить. Когда соединение завершено, вы активируете это событие.

Другими словами, ваш метод login не может сидеть и ждать результата. Он должен начать соединение и вернуться.

Когда вы получаете результат соединения, вы вызываете какой-либо метод обработки результата входа.

Использование блоков может сделать такие вещи проще, но есть и другие способы. Вам просто нужно перестать думать о таких вещах линейным образом. Для обработки асинхронной обработки требуется другой подход.

+0

Но пользователь ничего не может сделать, пока не войдет в систему. Кроме того, я не могу сделать функцию соединения общей. Мне нужно специально написать другой ответ для каждого раза, когда мне нужно подключиться, например, оператор 7500 if для каждой конкретной ситуации, а не позволить функции, которая вызвала ее обработкой ответа? Это не кажется хорошим - спасибо, хотя – Rossi

+0

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

+0

@Rossi Вы можете обобщить его, используя блок обработчика завершения. У многих классов есть методы, которые принимают блоки завершения. Вы можете реализовать свой код, так что блок завершения вызывается, когда соединение выполняется. – rmaddy

Смежные вопросы