Intereting Posts
iBeacon: CBPeripheralManager: 0x1557b230 может принимать эту команду только при включенном состоянии Отношение CoreData, с помощью Delete Почему мой UItableView не прокручивается по горизонтали, тогда как я установил ContentSize больше? Obj-C, обновляющая часть таблицы после загрузки массива с его строками? Покупка в приложении: прослушивание кнопки «Отмена»? Objective-C как представить лист действий из панели вкладок, который перекрывает текущий вид? строка состояния при представлении контроллера вида модели в ios 7 iPhone изменить название кнопки без кода Эффективность сохранения эффективности iOS Обновление объекта синтаксического анализа для текущего пользователя вместо создания повторяющейся записи Вызов метода для делегата Objective-C из Swift Уникальность MKAnnotation Ошибка переименования файла с помощью NSCocoaErrorDomain Code = 513 на устройстве Настройка Qt / QMake iOS Target, Device, другие настройки XCode NSLocalizedDescription = Ожидаемый код состояния в (200-299), получил 400

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 секунд.

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