我只是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;
}
答案 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
可能发生的事情是
你总是看到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)
您还应该查看缓存点,因为每次滚动时,都会下载图像,这对用户来说不是口袋友好的。您必须缓存已下载的内容。