0

Недавно я начал разрабатывать для iOS и столкнулся с проблемой, которая, возможно, очевидна для вас, но я не мог понять это сам. То, что я пытаюсь сделать, - выполнить задачу за другим, используя многопоточность, предоставляемую GCD.Выполнение задачи за другим

Это мой код для извлечения JSON (положить в классе с одноплодным) CategoriesStore

- (instancetype)initPrivate { 
    self = [super init]; 

    if (self) { 
     [self sessionConf]; 

     NSURLSessionDataTask *getCategories = 
     [self.session dataTaskWithURL:categoriesURL 
        completionHandler:^(NSData *data, 
             NSURLResponse *response, 
             NSError *error) { 
         if (error) { 
          NSLog(@"error - %@",error.localizedDescription); 
         } 

         NSHTTPURLResponse *httpResp = (NSHTTPURLResponse *) response; 

         if (httpResp.statusCode == 200) { 
          NSError *jsonError; 

          NSArray *json = 
          [NSJSONSerialization JSONObjectWithData:data 
                  options:NSJSONReadingMutableContainers 
                   error:&jsonError]; 
          if (!jsonError) { 
           _allCategories = json; 
           NSLog(@"allcategories - %@",_allCategories); 
          } 
         } 
     }]; 

     [getCategories resume]; 
    } 

    return self; 
} 

Затем в ViewController исполняет

- (void)fetchCategories { 
    NSLog(@"before"); 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
      CategoriesStore *categories = [CategoriesStore sharedStore]; 
     dispatch_async(dispatch_get_main_queue(), ^(void) { 
      _allDirectories = categories.allCategories; 
      [self.tableView reloadData]; 
      NSLog(@"after"); 
     }); 
    }); 
} 

-fetchCategories выполняются в viewDidAppear. Результат обычно до, после, а затем JSON. Очевидно, что я хочу получить раньше, json после.

Я также попытался сделать это с dispatch_group_notify, но не работал.

Как я могу заставить его работать? Почему он не ждет завершения первой задачи? Спасибо за помощь! С уважением, Адриан.

ответ

0

Я хотел бы предложить, чтобы определить специальный метод в CategoriesStore, который извлекает данные с удаленного сервера и принимает обратный вызов в качестве аргумента:

- (void)fetchDataWithCallback:(void(^)(NSArray *allCategories, NSError* error))callback 
{ 

    NSURLSessionDataTask *getCategories = 
     [self.session dataTaskWithURL:categoriesURL 
        completionHandler:^(NSData *data, 
             NSURLResponse *response, 
             NSError *error) { 
         if (error) { 
          NSLog(@"error - %@",error.localizedDescription); 
          callback(nil, error); 
          return; 
         } 

         NSError *jsonError = nil; 

         NSArray *json = 
         [NSJSONSerialization JSONObjectWithData:data 
                 options:NSJSONReadingMutableContainers 
                  error:&jsonError]; 
         if (!jsonError) { 
          _allCategories = json; 
          NSLog(@"allcategories - %@",_allCategories); 
          callback(_allCategories, nil); 
         } else { 
          callback(nil, jsonError); 
         } 
     }]; 

     [getCategories resume]; 
} 

и вы можете использовать его в ViewController:

- (void)fetchCategories { 
    [[CategoriesStore sharedStore] fetchDataWithCallback:^(NSArray *allCategories, NSError* error) { 
     if (error) { 
      // handle error here 
     } else { 
      _allDirectories = allCategories; 
      [self.tableView reloadData]; 
     } 
    }] 
} 

Таким образом вы перезагрузите представление таблицы после загрузки данных & разбор.

0

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

dispatch_sync(dispatch_get_main_queue(), { 
    _allDirectories = categories.allCategories; 
    [self.tableView reloadData]; 
} 
NSLog(@"after"); 
0

Я использовал метод, предложенный @ sgl0v, хотя это не было решением, которое я ожидал. Другой способ сделать это - использовать центр уведомлений и прослушивать событие.

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