在iphone上下载asynchoronus图像

时间:2010-09-14 04:25:39

标签: iphone

如何使这段代码异步?

因为此代码允许在imageview中更改图像,但现在它的速度很慢

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSUInteger sections = [indexPath section]; 

    if (sections  == 3)
    { 
        ltxt.text = [NSString stringWithFormat:@" %d of %d", tap,[a1 count]];


        if(tap<[a1 count]-1) {

            tap++;

    NSString *sa=[a1 objectAtIndex:tap];

            image= [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat: sa,[a1 objectAtIndex:tap ]]]]];


          //  NSData *imageData = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0)]; 


            myImageView.image = image;
            //[myimg release];
}

1 个答案:

答案 0 :(得分:1)

这取决于您在任何给定时间需要请求的图像数量。我发现工业强度设计/要求的一个很好的解决方案是创建一个请求漏斗(减少图像数量)。这些请求支持取消(当图像视图离开屏幕时),并且都通过NSOperationQueue处理。有大量的线程工作(阅读:不是为了noob)让它无缝,但它适用于有大量图像的大型表格(因为天花板对于你可以装入物理内存的图像数量而言相当低具有最少内存量的iOS设备。)

如果您要下载大量图片,那么这是一种“正确”的方式。如果没有,那么你可以使用performSelectorInBackground:...来查看实现,然后让对象执行自己的锁定/处理。无论哪种方式,您都必须在下载图像时执行某些操作/显示内容,因此在接收图像时不会阻止调用线程(通常是主线程)。

Q ::跟进:谢谢,但我应该在哪里声明这个方法? if if(sections == 3){} - user437503

A ::它将采用“通用”形式:

- (void)setCellImage:(UIImage *)img {
/* assert here if called from secondary thread */
    myImageView.image = img;
}

- (void)udpateImageFollowingTap {
    NSAutoreleasePool * pool = [NSAutoreleasePool new];
    NSString * imageUrl = [self.a1 objectAtIndex:self.tap];
    UIImage * tmpImage = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]]];
    [self performSelectorOnMainThread:@selector(setCellImage:) withObject:tmpImage];
    [tmpImage release];
    [pool release];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger sections = [indexPath section];
    if (sections == 3) {
        ltxt.text = [NSString stringWithFormat:@" %d of %d", tap,[a1 count]];
        if(tap<[a1 count]-1) {
            tap++;
            /* insert code to discard previous image and display loading image indication here */
            [self performSelectorInBackground:@selector(udpateImageFollowingTap) withObject:0];
        }
    }
}