dispatch\u sync vs dispatch\u async:iOS JSON解析

dispatch\u sync vs dispatch\u async:iOS JSON解析,ios,objective-c,json,uitableview,Ios,Objective C,Json,Uitableview,我只是一个iOS初学者,所以请忽略我的愚蠢,但请澄清我的疑问。 我正在UITableView中显示已解析的数据。因为我正在使用存储在NSDictionary中的URL下载给定图像 我需要一个很好的解释我是否应该使用 dispatch_sync(,{ dispact_async (,{})); 或 这是我用来填充UITableview数据的代码 -(UITableViewCell *) tableView:(UITableView *)tableView cell

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

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

dispatch_sync(,{
                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)异步分派到串行 排队
  • 线程2:开始执行任务1
  • 线程1:将另一个任务(任务2)分派到串行队列
  • 线程2:任务1已完成。开始执行任务2
  • 线程2:任务2已完成

  • 您总是会看到12

    唯一的区别是,dispatch\u sync仅在块完成后返回,而dispatch\u 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)异步分派到串行 排队
  • 线程2:开始执行任务1
  • 线程1:将另一个任务(任务2)分派到串行队列
  • 线程2:任务1已完成。开始执行任务2
  • 线程2:任务2已完成

  • 您总是会看到12

    唯一的区别是,dispatch\u sync仅在块完成后返回,而dispatch\u async在将其添加到队列后返回,并且可能未完成

    dispatch\u sync等待直到您的块未完成,dispatch\u async将任务添加到队列中


    使用dispatch_async,因为如果运行日志任务,它不会阻塞您的ui。

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

    dispatch\u sync等待直到您的块未完成,dispatch\u async将任务添加到队列中


    使用dispatch\u async,因为如果运行日志任务,它不会阻塞您的ui。

    下面是填充TableView的好方法。它是用Swift编写的,使用GCD、NSOperation和NSOperationQueue。

    下面是填充TableView的好方法。它是用Swift编写的,使用GCD、NSOperation和NSOperationQueue。

    当数千条记录出现在tableview中时,尝试使用json bcs使用dispatch\u async,这样您就可以轻松地滚动bcs dispatch\u async了


    dispatch\u sync是指当数千条记录到达tableview时,应用程序中的tableview处于挂起或停止状态。

    尝试使用json bcs使用dispatch\u async。当数千条记录到达tableview时,您可以轻松滚动bcs dispatch\u async


    dispatch\u sync是指当应用程序中出现数千条记录时,tableview被挂起或停止。

    由于多种原因,您所做的是绝对错误的

    细胞被重复使用。您注意到对dequeueReusableCellWithIdentifier的调用了吗?当您尝试存储图像时,该单元格很可能被重新使用以显示完全不同的内容


    dispatch_sync将等待直到执行块。您正在创建一个队列,然后在其上分派一个任务,因此这是毫无意义的。只需在后台队列中分派。当您的块执行时,它首先进行同步下载。您的代码将等待下载完成。如果您的internet连接有问题,则可能需要60秒才能呼叫失败。(是的,它可能失败)。因此,您的应用程序将挂起60秒

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

    细胞被重复使用。您注意到对dequeueReusableCellWithIdentifier的调用了吗?当您尝试存储图像时,该单元格很可能被重新使用以显示完全不同的内容


    dispatch_sync将等待直到执行块。您正在创建一个队列,然后在其上分派一个任务,因此这是毫无意义的。只需在后台队列中分派。当您的块执行时,它首先进行同步下载。您的代码将等待下载完成。如果您的internet连接有问题,则可能需要60秒才能呼叫失败。(是的,它可能失败)。因此,您的应用程序将挂起60秒

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

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

    谢谢您这么好的解释。这也消除了我的其他疑虑。但我还需要知道,在这种情况下,我提供的选项中,哪一个是提高图像下载效率的更好方法。检查此链接:。这可能对你完全有帮助。仔细阅读这篇文章,看看能不能找到这么好的解释。这也消除了我的其他疑虑。但我还需要知道,在这种情况下,我提供的选项中,哪一个是提高图像下载效率的更好方法。检查此链接:。这可能对你完全有帮助。仔细阅读,但对于一个显示当前图像的对象。你能纠正我吗?这真的很有帮助。所以我应该只在dispatch\u sync中设置映像,并且必须在其中使用dispatch\u async?但是对于一个对象,它显示的是当前映像。你能纠正我吗?那真的很有帮助。所以我应该在di中设置我的映像