dispacth_sync vs dispatch_async: синтаксический анализ iOS JSON

Я просто новичок в iOS, поэтому, пожалуйста, игнорируйте мою глупость, но любезно очистите мои сомнения. Я показываю проанализированные данные в UITableView. В этом я загружаю изображение, используя URL-адрес, хранящийся в моем NSDictionary.

Мне нужно хорошее объяснение, следует ли мне использовать

dispatch_sync(,{ dispact_async (,{})); 

или

 dispatch_async(,{ dispact_async (,{})); 

Это мой код для заполнения данных UITableview.

 -(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ CustomClassCellTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell" forIndexPath:indexPath ]; BookMyShow *bookMyShow = [_jsonArray objectAtIndex:indexPath.row]; cell.eventCode.text = bookMyShow.eventCode; cell.eventName.text = bookMyShow.eventName; NSURL *url = [NSURL URLWithString:bookMyShow.imageString]; //NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //[request setHTTPMethod:@"GET"]; dispatch_queue_t loadQ = dispatch_queue_create("DownloadQueue", NULL); dispatch_sync(loadQ, ^{ NSData *data = [NSData dataWithContentsOfURL:url]; dispatch_async(dispatch_get_main_queue(), ^{ cell.myImageView.image = [UIImage imageWithData:data]; }); }); // [cell.imageView setImageWithURL:[NSURL URLWithString:[[array objectAtIndex:indexPath.row] objectForKey:@"image"]] placeholderImage:nil]; //cell.imageView.image = [UIImage imageNamed:bookMyShow.imageString]; return cell; } 

Единственное различие заключается в том, что dispatch_sync возвращается только после завершения блока, тогда как dispatch_async возвращается после его добавления в очередь и может не закончиться.

следующий код:

 dispatch_async(_serialQueue, ^{ printf("1"); }); printf("2"); dispatch_async(_serialQueue, ^{ printf("3"); }); printf("4"); 

Результат:
Он может печатать 2413 или 2143 или 1234, но 1 всегда до 3

Для этого кода:

  dispatch_sync(_serialQueue, ^{ printf("1"); }); printf("2"); dispatch_sync(_serialQueue, ^{ printf("3"); }); printf("4"); 

Результат: 1234

Что может случиться

  1. Тема 1: dispatch_async задача времени (задача 1) для последовательной очереди
  2. Тема 2: запуск выполнения задачи 1
  3. Тема 1: dispatch_async другая задача (задача 2) в очередь на очереди
  4. Тема 2: задача 1 завершена. начать выполнение задания 2
  5. Тема 2: задача 2 завершена.

и вы всегда видите 12

Вот отличный пример показывает хороший способ заполнить TableView. Он написан в Swift, использует GCD, NSOperation и NSOperationQueue.

попробуйте использовать dispatch_async, используя json bcs, когда тысяча записей попадает в таблицу, чем вы можете легко прокручивать bcs dispatch_async является гибким.

dispatch_sync – это когда приходит тысяча записей, чем в режиме просмотра или просмотра в приложении.

Единственное различие заключается в том, что dispatch_sync возвращается только после завершения блока, тогда как dispatch_async возвращается после его добавления в очередь и может не закончиться.

dispatch_sync Подождите, пока ваш блок не будет завершен, и dispatch_async добавит задачу в очередь.

используйте dispatch_async, потому что он не застрял в ui, если вы запускаете задачу журнала.

То, что вы делаете, абсолютно неверно по нескольким причинам.

Ячейки повторно используются . Вы заметили обращение к dequeueReusableCellWithIdentifier? К тому моменту, когда вы пытаетесь сохранить изображение, вполне вероятно, что ячейка повторно используется для отображения чего-то совершенно другого.

dispatch_sync ждет, пока блок не будет выполнен. Вы создаете очередь, а затем отправляете на нее одну задачу, так что это абсолютно бессмысленно. Просто отправьте в фоновом режиме. Когда ваш блок выполняется, он сначала выполняет синхронную загрузку. Ваш код будет ждать завершения загрузки. Если у вас возникли проблемы с подключением к Интернету, это может занять 60 секунд, пока вызов не завершится. (Да, он может потерпеть неудачу). Таким образом, ваше приложение будет висеть в течение 60 секунд.

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