dispacth_sync vs dispatch_async:iOS JSON解析

时间:2016-05-10 10:17:00

标签: ios objective-c json uitableview

我只是iOS的初学者,所以请忽略我的愚蠢,但请清楚我的怀疑。 我在UITableView中显示已解析的数据。我正在使用存储在我的NSDictionary中的URL下载一个给图像。

我需要一个很好的解释是否应该使用

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

6 个答案:

答案 0 :(得分:2)

唯一的区别是dispatch_sync仅在块完成后返回,而dispatch_async在添加到队列后返回并且可能没有完成。

以下代码:

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

结果是:
它可以打印2413或2143或1234但总是在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完成。
  6. 你总是看到12

答案 1 :(得分:2)

这是伟大的example显示填充TableView的好方法。它用Swift编写,使用GCD,NSOperation和NSOperationQueue。

答案 2 :(得分:1)

唯一的区别是dispatch_sync仅在块完成后返回,而dispatch_async在添加到队列后返回并且可能没有完成。

dispatch_sync等到您的块未完成,dispatch_async将任务添加到队列中。

使用dispatch_async,因为如果你运行日志任务它不会卡住你的ui。

答案 3 :(得分:1)

尝试使用json bcs时使用dispatch_async,当有数千条记录进入tableview时,你可以轻松滚动bcs dispatch_async是灵活的。

dispatch_sync是指在您的应用程序中挂起或停止tableview的数千条记录。

答案 4 :(得分:1)

出于多种原因,你所做的绝对是错误的。

重复使用单元格。您是否注意到对dequeueReusableCellWithIdentifier的调用?当您尝试存储图像时,很可能会重复使用单元格来显示完全不同的内容。

dispatch_sync一直等到块执行完毕。您正在创建一个队列,然后在其上调度一个任务,因此这绝对没有意义。只需在后台队列上调度即可。当块执行时,它首先进行同步下载。您的代码将等待以完成该下载。如果您的互联网连接出现问题,则呼叫失败可能需要60秒。 (是的,它可能会失败)。因此,您的应用将挂起 60秒。

答案 5 :(得分:1)

您还应该查看缓存点,因为每次滚动时,都会下载图像,这对用户来说不是口袋友好的。您必须缓存已下载的内容。