Принудительное ожидание завершения NSURLSessionDataTask

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

Я надеялся сделать это, введя имя пользователя и пароль в два текстовых поля, а затем нажав кнопку, которая вызовет функцию, указанную ниже. Эта функция запускает NSURLSessionDataTask и построить структуру с логическим успехом / неудачей входа в систему и NSString с соответствующим сообщением об ошибке (если есть).

Проблема в том, что моя функция возвращает структуру перед моим NSURLSessionDataTask's Завершение блока завершено. Могу ли я заставить свою программу подождать, пока это задание не прекратится или не завершится? Или я могу перенести выполнение блока завершения в основной поток и до того, как функция вернется?

Спасибо! Пожалуйста, дайте мне знать, если есть какие-либо разъяснения, которые мне нужно сделать!

(Кроме того, я видел несколько похожих вопросов, распространяющихся вокруг Stackru, в которых упоминается GCD. Является ли это излишним решением? Похоже, что ни один из этих вопросов не говорит об одном и том же или не на уровне, который выше моего нынешнего понимания. Я все еще очень плохо знаком с Objective-C)

- (struct RequestReport) sendLoginRequest: (NSString*) username withPassword:  (NSString *) password

... (создание запроса и настройка тела HTTP)

NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error){

    NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData: data options:0 error:nil];

    success = (BOOL)jsonObject[@"success"];
    statusText = (NSString *) jsonObject[@"errors"];

}];

[dataTask resume];

struct RequestReport rr;
rr.status = statusText;
rr.success = success;

return rr;

1 ответ

Решение

Ваш метод должен выглядеть так:

- (void) sendLoginRequest:(NSString*) username withPassword:(NSString *) password callback:(void (^)(NSError *error, BOOL success))callback
    {
    NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error){
        if (error) {
            // Handle error
        }
        else {
           callback(error, YES);
       }
  }];

    [dataTask resume];

}

Вызовите этот метод так:

[self sendLoginRequest:@"myUsername" password:@"password" callback:^(NSString *error, BOOL success) {
    if (success) {
         NSLog(@"My response back from the server after an unknown amount of time";
    }
}

См . Программирование Apple с Objective-C для получения дополнительной информации о блоках и http://fuckingblocksyntax.com/ о том, как объявлять блоки.

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