2016-05-10 3 views
1

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

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

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

Возможно, это не относится к этому вопросу, попробуйте отвлечь свою загружающую часть от cellForRowAtIndexPath для более чистого кода. Переходя к вашему вопросу См. Эту ссылку http://stackoverflow.com/questions/19822700/difference-between-dispatch-async-and-dispatch-sync-on-serial-queue – Feroz

ответ

2

Единственное отличие состоит в том, что 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

+0

спасибо за такие приятные объяснения. Это также очистило мои другие сомнения. Но мне также нужно знать, какие из предлагаемых мной вариантов - лучший способ добиться эффективности загрузки изображений в таком сценарии. –

+0

для загрузки вы можете использовать ASIHTTPRequest. Проверьте эту ссылку: https://allseeing-i.com/asihttprequest/how-to-use. Это может помочь вам. Прочтите внимательно –

1

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

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

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

2

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

+0

, что является одним из чистых примеров. Благодарю. –

1

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

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

1

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

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

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

+0

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

+0

, поэтому я должен установить свое изображение только в dispatch_sync и должен использовать dispatch_async внутри него? –

1

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