【问题标题】:Image loading from background从背景加载图像
【发布时间】:2011-06-09 07:34:27
【问题描述】:

我正在后台加载图像。使用此代码

-(void)backgroundImageLoading
{
    if(isGroupOrFriend)
    {
        NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];

        for(NSDictionary *d in m_kwikiArray)
        {
            NSMutableDictionary *dict=[NSMutableDictionary dictionary];
            if([d valueForKey:@"UserImage"]!=nil && ![[d valueForKey:@"UserImage"] isEqualToString:@""])
            {
                UIImage *img=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[d valueForKey:@"UserImage"]]]];
                if(img!=nil)
                    [dict setObject:img forKey:@"UserImage"];
            }
            else 
                [dict setObject:@"No Image" forKey:@"UserImage"];
            //if([d valueForKey:@"imagePath"]!=nil && ![[d valueForKey:@"imagePath"] isEqualToString:@""] )
            //          [dict setObject:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[d valueForKey:@"imagePath"]]]] forKey:@"imagePath"];
            //      else 
            //          [dict setObject:@"NO Image" forKey:@"imagePath"];
            if([[d valueForKey:@"Transactions"] count]>0)
            {
                if([[[d valueForKey:@"Transactions"] objectAtIndex:0] valueForKey:@"UserThumbnail"]!= nil && ![[[[d valueForKey:@"Transactions"] objectAtIndex:0]valueForKey:@"UserThumbnail"] isEqualToString:@""])
                {
                    UIImage *img1=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[[[d valueForKey:@"Transactions"] objectAtIndex:0] valueForKey:@"UserThumbnail"]]]];
                    if(img1!=nil)
                        [dict setObject:img1 forKey:@"UserThumbnail1"];
                }
                else 
                    [dict setObject:@"NOImage" forKey:@"UserThumbnail1"];
            }
            else 
                [dict setObject:@"NOImage" forKey:@"UserThumbnail1"];
            if([[d valueForKey:@"Transactions"] count]>1)
            {
                if([[[d valueForKey:@"Transactions"] objectAtIndex:1] valueForKey:@"UserThumbnail"]!=nil && ![[[[d valueForKey:@"Transactions"] objectAtIndex:1] valueForKey:@"UserThumbnail"] isEqualToString:@""])
                {
                    UIImage *img2=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[[[d valueForKey:@"Transactions"] objectAtIndex:1] valueForKey:@"UserThumbnail"]]]];
                    if(img2!=nil) 
                        [dict setObject:img2 forKey:@"UserThumbnail2"];
                }
                else 
                    [dict setObject:@"NOImage" forKey:@"UserThumbnail2"];
            }
            else 
                [dict setObject:@"NOImage" forKey:@"UserThumbnail2"];
            [imageForGruopAndFriendArray addObject:dict];

        }
        //isReloadTable=YES;
        [mTable reloadData];
        [pool release];
    }
    else 
    {
        NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];

        for(NSDictionary *d in m_kwikiArray)
        {
            NSMutableDictionary *dict=[NSMutableDictionary dictionary];
            if([d valueForKey:@"Illustration"]!=nil && ![[d valueForKey:@"Illustration"] isEqualToString:@""])
            {
                UIImage *img=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[d valueForKey:@"Illustration"]]]];
                if(img!=nil)
                    [dict setObject:img forKey:@"Illustration"];
            }

            else 
                [dict setObject:@"No Image" forKey:@"Illustration"];
            if([d valueForKey:@"imagePath"]!=nil && ![[d valueForKey:@"imagePath"] isEqualToString:@""] )
            {
                UIImage *img1=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[d valueForKey:@"imagePath"]]]];
                if(img1!=nil)
                    [dict setObject:img1 forKey:@"imagePath"];
            }
            else 
                [dict setObject:@"NO Image" forKey:@"imagePath"];
            if([[d valueForKey:@"Transactions"] count]>0)
            {
                if([[[d valueForKey:@"Transactions"] objectAtIndex:0] valueForKey:@"UserThumbnail"]!= nil && ![[[[d valueForKey:@"Transactions"] objectAtIndex:0]valueForKey:@"UserThumbnail"] isEqualToString:@""])
                {

                    UIImage *img2=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[[[d valueForKey:@"Transactions"] objectAtIndex:0] valueForKey:@"UserThumbnail"]]]];
                    if(img2!=nil)
                        [dict setObject:img2 forKey:@"UserThumbnail1"];
                }
                else 
                    [dict setObject:@"NOImage" forKey:@"UserThumbnail1"];
            }
            else 
                [dict setObject:@"NOImage" forKey:@"UserThumbnail1"];
            if([[d valueForKey:@"Transactions"] count]>1)
            {
                if([[[d valueForKey:@"Transactions"] objectAtIndex:1] valueForKey:@"UserThumbnail"]!=nil && ![[[[d valueForKey:@"Transactions"] objectAtIndex:1] valueForKey:@"UserThumbnail"] isEqualToString:@""])
                {
                    UIImage *img3=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[[[d valueForKey:@"Transactions"] objectAtIndex:1] valueForKey:@"UserThumbnail"]]]];
                    if(img3!=nil)
                        [dict setObject:img3 forKey:@"UserThumbnail2"];
                }
                else 
                    [dict setObject:@"NOImage" forKey:@"UserThumbnail2"];
            }
            else 
                [dict setObject:@"NOImage" forKey:@"UserThumbnail2"];
            [imageArray addObject:dict];

        }
        //isReloadTable=YES;
        [mTable reloadData];
        [pool release];
    }
}

这里我在每次图像加载后在方法中使用 reloadData,但它不会在滚动表格后加载图像显示。

我想在这些图片加载后立即显示它们。

请帮帮我。提前谢谢。

【问题讨论】:

  • 您是否尝试在主线程以外的另一个线程中更新 ui?

标签: iphone image uitableview background loading


【解决方案1】:

伊修,

试着用这个代替[mTable reloadData]:

[mTable beginUpdates];
[mTable endUpdates];

顺便说一句,很抱歉,这段代码完全不可读。

【讨论】:

  • 这仍然不起作用,我需要滚动查看表格中显示的图像。
【解决方案2】:

Ishu,您的代码的基本问题是您无法在辅助线程中通过 UIImage imageWithData API 加载图像。 UIKit APIS 只能在主线程中使用。您可以做的是下载项目并将它们保存到辅助线程中的文件中,但您仍然需要在主线程中加载该图像数据。如果您只想下载然后加载图像数据,您甚至不需要辅助线程,因为 NSURLConnection 类已经支持异步完成回调,下载会在后台线程中自动完成。

【讨论】:

    【解决方案3】:

    [m_Table reloadData];的代码中添加这一行,我使用这一行

    [m_Table performSelectorOnMainThread:@selector(reloadData) withObject:self waitUntilDone:NO];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 2015-01-14
      • 1970-01-01
      • 2017-10-21
      • 2016-03-31
      • 2014-02-17
      • 2012-11-05
      相关资源
      最近更新 更多