Принудительное ожидание завершения 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/ о том, как объявлять блоки.