dispatch\u sync vs dispatch\u async:iOS JSON解析
我只是一个iOS初学者,所以请忽略我的愚蠢,但请澄清我的疑问。 我正在UITableView中显示已解析的数据。因为我正在使用存储在NSDictionary中的URL下载给定图像 我需要一个很好的解释我是否应该使用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
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
可能发生的是
您总是会看到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
可能发生的是
您总是会看到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中设置我的映像