@Artem_AK

Какие есть способы получения данных из global queue помимо Notification center?

К примеру, для того чтобы контроллер получил данные вызвав метод модели «getData» (представлен ниже) я использую Notification center, который публикует полученные данные в уведомлении, на которое подписан заданный контроллер.

Я хотел бы узнать: есть ли альтернативные варианты получения данных контроллером из global queue?

Спасибо!

- (void)getData {
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@""]];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error) {
            NSLog(@"%@", error.description);
        } else {
            NSError *parsingError;
            NSDictionary *parsedData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&parsingError];
            if (parsingError) {
                    NSLog(@"Error while parsing data %@", parsingError.description);
            } else {
                dispatch_async(dispatch_get_main_queue(), ^{
                    [[NSNotificationCenter defaultCenter] postNotificationName:@"identifier" object:parsedData];
                });
            }
        }
    }];
    [task resume];
}
  • Вопрос задан
  • 200 просмотров
Решения вопроса 1
Flanker_4
@Flanker_4
Обычно для асинхронных задач используют блоки
- (void)getData:(void(^)(id result))completionBlock {
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@""]];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error) {
            NSLog(@"%@", error.description);
        } else {
            NSError *parsingError;
            NSDictionary *parsedData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&parsingError];
            if (parsingError) {
                    NSLog(@"Error while parsing data %@", parsingError.description);
            } else {
                dispatch_async(dispatch_get_main_queue(), ^{
                    if (completionBlock){
                       completionBlock(parsedData);
                   }
                });
            }
        }
    }];
    [task resume];
}

Вызов выглядит так
[self getData:^(id result){
    //process
}];

Да Вы, собственно, и сами пользуетесь этим способом в NSURLSession. Дабы избежать калбек хелла можно посмотреть в сторону PromiseKit

Еще один, уже почти забытый способ, через делегаты...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы