由UIViews构建的UITableView Custom单元可以并发吗?

时间:2013-03-12 18:56:45

标签: ios uitableview concurrency

我正在构建我的cellViews:

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString* cellIdentifier=@"cell";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if(cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
    }

    UIImageView cellView = [[UIImageView alloc] initWithFrame:rectCellFrame];

    NSError* error=nil;
    NSData* imageData = [NSData dataWithContentsOfURL:imageArray[indexPath.row] options:NSDataReadingUncached error:&error];

    UIImage* theImage= [UIImage ImageWithData:imageData];

    [cellView setImage:theImage];

    [cell addSubView:cellView];

    .
    .
    .
    .

    [cell addSubView:moreViews];

}

由于加载时间(即使图像被缓存)非常慢,我需要将其同时进行。但我想仍然使用我的代码与UIViews / UIImageViews。 有没有办法让我显示一个占位符,当相关时,即cellView从所有子视图完成构建,更新图像而不是占位符?

1 个答案:

答案 0 :(得分:1)

不确定。您可以在异步任务中设置所有繁重的慢速代码。当需要下载图像时,它通常会关闭。我确信它至少包含在桌面视图中的一个WWDC视频中,但我不知道现在它将会是哪一个或多大。

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // place holder image for the moment
    [cellView setImage:placeHolderImage];

    // run code to get the real image in asynchronous task 
    dispatch_async(self.contextQueue, ^{
        UIImage *realImage = [thingy imageFromTimeConsumingTask];
        // update cell on main thread (you need to do all UI stuff on main thread)
        dispatch_async(dispatch_get_main_queue(), ^{
            [cellView setImage:realImage];
        });
    });
}