#objective-c #api #thread-safety #nsurlconnection #nsurlsession
#objective-c #API #потокобезопасность #nsurlconnection #nsurlsession
Вопрос:
У меня есть эта часть кода, и она работала с «NSURLConnection sendSynchronousRequest», и у них была отправка, и в ней были оба вызова API без проблем, однако, поскольку я перехожу к «NSURLSession», и я хотел бы вызвать следующий API после первого ответа внутри обработчика завершения, сделайтемне нужно добавить какой-либо тип отправлений для второго вызова API?
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch was here
__block NSString* url = @"www.google.com";
[[LoaderService get] getRequestFrom:url completionHandler:^(TcHttpJSONResponse *response) { // first Call
if (!response.success) {
dispatch_async(dispatch_get_main_queue(), ^{
failBlock();
});
return;
}
url = [NSString stringWithFormat:@"www.google.com/drive"];
[[LoaderService get] getRequestFrom:url completionHandler:^(TcHttpJSONResponse *response) { // second Call
if (!response.success) {
dispatch_async(dispatch_get_main_queue(), ^{
failBlock();
});
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
successBlock(transactionsArray);
});
}];
}];
// }]; //end of dispatch
в LoaderService
- (void)getRequestFrom:(NSString *)url completionHandler:(void (^)(TcHttpJSONResponse *response))completionHandler {
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithRequest:[TcHttpHelper getRequestFromUrlWithAuthorizationToken:url token:[self getAuthToken]]
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
completionHandler([[TcHttpJSONResponse alloc] initWithResponse:data urlResponse:(NSHTTPURLResponse*)response error:error]);
}] resume];
}
Комментарии:
1. Я не проверял весь ваш код, но в принципе то, что вы пытаетесь сделать, должно работать без проблем.
2. @skaak да, это работает, но правильно ли это? нужно ли добавлять «dispatch_async» перед вторым, третьим и т.д. http-вызовом, поскольку он находится внутри обработчика завершения предыдущего вызова?
3. Привет — нет, вы можете отправить его в любое время и в любом потоке.
NSURLSession.currentSession dataTask...
иNSURLSession.currentSession downloadTask...
являются ли ваши два готовых решения для простой асинхронной загрузки. Вы можете отправлять им сообщения из любого места, поскольку все, что они делают, это планируют новую задачу, которая затем будет выполняться в другом потоке, и сообщают вам, когда закончите.4. Если вы хотите обновить пользовательский интерфейс по завершении, вам следует беспокоиться об отправке в основной поток в обработчике завершения.
5. для вложенного вызова будет много диспетчеров для обновления пользовательского интерфейса, и это не будет красивым кодом, я исправил это, используя delegateQueue при создании сеанса, поэтому весь обработчик завершения теперь находится в основном потоке. Большое спасибо за помощь @skaak