Intereting Posts
Обмен изображениями и текстом с глубоким связыванием на facebook в ios8 JS-код не выполняется в режиме веб-приложения iOS, но отлично подходит для сафари iOS Открыть ракурс ios с CDVPlugin Ошибка RangeOfString при отсутствии результата iOS итерация dirs с помощью filemanager занимает довольно много памяти Настройки приложения или настройки Bundle Как скопировать или вычесть CGMutablePathRf другим CGMutalbePathRef? быстрый показ сообщений от всех пользователей Firebase Масштабирование iPad Pro App для iPad Air Получать количество непрочитанных сообщений через API Gmail Как сохранить данные для входа в приложение iOS Производительность системы и использование батареи при использовании акселерометра и гироскопа Получение недопустимой ошибки шестнадцатеричного символа при отправке уведомления Apple через мобильную первую платформу с помощью XCTest Expectation, но он не дожидается секунд, которые я установил Щелкните правой кнопкой мыши MenuIcon

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; } 

Solutions Collecting From Web of "dispacth_sync vs dispatch_async: синтаксический анализ iOS JSON"

Единственное различие заключается в том, что 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 секунд.

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