我有来自服务器的tableviewcontroller和数据。我使用以下类来下载数据asyn。但我的问题是当用户看到tableViewcontroller时数据正在加载。我希望在用户看到之前加载数据。
#import <SDWebImage/UIImageView+WebCache.h>
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.textLabel.text = [[tableData objectAtIndex:indexPath.row] valueForKey:@"name"];
cell.textLabel.font = [UIFont fontWithName:@"BebasNeue" size:24];
cell.textLabel.textColor = [UIColor whiteColor];
NSString *imageURLString=[[tableData objectAtIndex:indexPath.row] valueForKey:@"logo"];
NSString* imageURL = [[tableData objectAtIndex:indexPath.row] valueForKey:@"picture"];
[cell.imageView setImageWithURL:[NSURL URLWithString:imageURL]];
}
答案 0 :(得分:0)
使用SDWebImage,您可以先下载图片。
这取决于您的实施。可能在以前的控制器中,或在appDelegate
中。如果tableview
出现在您的初始viewcontroller
中,则可能完全取决于网络速度。
看看这段代码(从库的自述文件中提取,检查源!):
Manager *manager = [SDWebImageManager sharedManager];
[manager downloadWithURL:imageURL
options:0
progress:^(NSInteger receivedSize, NSInteger expectedSize)
{
// YOU DON'T NEED THIS
}
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
{
if (image)
{
// MAYBE YOU WANT TO DO SOMETHING HERE
}
}];
然后,在您的tableView:cellForRowAtIndexPath:
方法中,您可以像这样设置图像:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// ...
NSURL* url = GET_IMAGE_URL;
[cell.imageView setImageWithURL:url];
// ...
}
库首先在其缓存中查找,它将在其中找到以前下载的图像,因为它使用图像URL作为缓存的键,以便图像显示在中。
答案 1 :(得分:-1)
您正在下载数据并将其加载到tableView异步,这意味着您的数据进程正在后台执行,但tableView仍然处于活动状态并且已显示。
我以两种方式处理这种情况
您首先在NSArray
或NSDictionary
(您需要的任何对象)中加载所有数据,然后再展示TableViewController
,并将其作为参数传递给TableViewController
1}}。换句话说,您需要在展示tableViewController
。
您需要在执行下载数据时创建动画视图或加载视图,告诉用户数据正在加载,因此请等待该过程完成。完成此过程后,只需重新加载tableView并将数据传递给TableViewCells
。
1)当您向服务器发送请求以获取数据时(例如来自JSON)
,将使用此代码LoadingView *spinn = [LoadingView loadSpinnerIntoView:self.view];
dispatch_queue_t downloadQueue = dispatch_queue_create("LoadingView", NULL);
dispatch_async(downloadQueue, ^{
// do our long running process here
[NSThread sleepForTimeInterval:0.1];
// do any UI stuff on the main UI thread
dispatch_async(dispatch_get_main_queue(), ^{
//Start downloading your data, and pass data you fetched to objects of NSDictionary
//Your methods
//After downloading data is done, reload data on tableView
[tableView reloadData];
//Remove loading view, and your tableViewController is all set
[spinn removeSpinner];
});});
2)从您提出的请求中获取数据NSDictionary
或NSArray
后,您还可以下载图片链接。
要在不阻止mainThread的情况下下载图像异步,您可以参考@sonxurxo问题,或者您也可以使用这个也使用SDWebImage
您只需要#import <SDWebImage/UIImageView+WebCache.h>
到项目中,并且只需使用以下代码即可在下载图像时定义占位符:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier] autorelease];
}
// Here we use the new provided setImageWithURL: method to load the web image
[cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
cell.textLabel.text = @"My Text";
return cell;
}