首先下载数据然后在TableViewcontroller上显示它

时间:2014-05-19 15:57:01

标签: ios uitableview

我有来自服务器的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]];

}

2 个答案:

答案 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仍然处于活动状态并且已显示。

我的解决方案

我以两种方式处理这种情况

  1. 您首先在NSArrayNSDictionary(您需要的任何对象)中加载所有数据,然后再展示TableViewController,并将其作为参数传递给TableViewController 1}}。换句话说,您需要在展示tableViewController

  2. 之前加载数据
  3. 您需要在执行下载数据时创建动画视图或加载视图,告诉用户数据正在加载,因此请等待该过程完成。完成此过程后,只需重新加载tableView并将数据传递给TableViewCells

  4. 实施例

    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)从您提出的请求中获取数据NSDictionaryNSArray后,您还可以下载图片链接。

    要在不阻止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;
    }