【问题标题】:CATiled Layer Async image downloadingCATiled 层异步图像下载
【发布时间】:2013-03-11 21:14:38
【问题描述】:

我正在自定义照片滚动条 xcode 源。对于平铺图像,我想在后台使用 nsoperation 从 Web 服务器下载图像。

应用程序会正确下载瓷砖图像,但不会刷新。不确定,如何在下载完成后立即刷新平铺图像。任何提示将不胜感激。


- (UIImage *)tileForScale:(CGFloat)scale row:(int)row col:(int)col
{
    //  Step 1
    //  format the target and source folder name using store id, flyer id and page number
    //  format the tile name using folder name and the tile col and row
    //  initiate the background process to download the target file, if required
    tileName = [NSString stringWithFormat:@"%@_%d_%d_%d.png", imageName, (int)(scale * 1000), col + 1, row + 1];
    [self startBackground];

    //  Step 2
    NSString *targetFileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@",tileName]];
//    NSLog(@"Return- %@",targetFileName);

    UIImage *image = [UIImage imageWithContentsOfFile:targetFileName];
    return image;
}

- (void)startBackground
{
    NSOperationQueue *queue = [NSOperationQueue new];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]
                                        initWithTarget:self
                                        selector:@selector(downloadAsRequired:)
                                        object:tileName];
    [queue addOperation:operation];
    [operation release];
}

- (void)downloadAsRequired:(NSString*)imageTileName
{
    //  Steps
    //  format target file
    //  check if target file exists
    NSString *targetFileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@",imageTileName]];
    NSFileManager *fileManager =[NSFileManager defaultManager];
    NSData  *dataFromFile = nil;

    dataFromFile = [fileManager contentsAtPath:targetFileName];
    if (dataFromFile==nil)
    {
        //  file doesn't exist
        NSString *folderName = [NSString stringWithFormat:@"S%@F1/P%d/",[flyer.storeIdentifier stringValue],index + 1];
        NSString *sourceFileName = [NSString stringWithFormat:@"%@%@%@",kLocationTiles,folderName,imageTileName];
        NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:sourceFileName]];
//        UIImage* image = [[[UIImage alloc] initWithData:imageData] autorelease];
        NSLog(@"%@-%@",sourceFileName,targetFileName);
        BOOL fileSaved = [fileManager createFileAtPath:targetFileName contents:imageData attributes:nil];
        if(!fileSaved)
        {
            NSLog(@"failed to copy tile");
        }
        else
        {
            NSLog(@"%@ created",targetFileName);
        }
        [imageData release];
//        [self performSelectorOnMainThread:@selector(displayImage:) withObject:image waitUntilDone:NO];
    }
    else
    {
        //  file exists, so do nothing
    }
}

【问题讨论】:

    标签: image asynchronous background-process catiledlayer


    【解决方案1】:

    - (UIImage *)tileForScale:(CGFloat)scale row:(int)row col:(int)col
    {
        //  Step 1
    
        UIImage *imageTile=nil;
        tileName = [NSString stringWithFormat:@"%@_%d_%d_%d", imageName, (int)(scale * 1000), col + 1, row + 1];
        NSString *targetFileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@.png",tileName]];
    
        NSFileManager *fileManager =[NSFileManager defaultManager];
        if ([fileManager fileExistsAtPath:targetFileName])
        {
            imageTile = [UIImage imageWithContentsOfFile:targetFileName];
        }
        else
        {
            NSString *folderName = [NSString stringWithFormat:@"%@%@/%d/",[id1 stringValue],[id2 stringValue],index + 1];
            NSString *sourceFileName = [NSString stringWithFormat:@"%@%@%@.png",kLocationTiles,folderName,tileName];
            NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:sourceFileName]];
    
            if (imageData != nil)
            {
                imageTile = [UIImage imageWithData:imageData];
                [fileManager createFileAtPath:targetFileName contents:imageData attributes:nil];
            }
            else
            {
                imageTile = [UIImage imageWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/logo.png"]]];
            }
    
            [imageData release];
        }
    
        return imageTile;
    }
    

    基本上,我稍微了解一下图片来源背后的逻辑。

    1) 我决定了最终图像的位置,例如 /tmp/tileXX.png 2)当我加载磁贴时,我在目标文件夹中寻找磁贴 3)如果它不存在,我从服务器下载源图像并使用它绘制瓷砖,但也在目标文件夹中以供将来参考。所以下次画的时候已经可以用了,就不下载了。 4)当用户滚动页面或放大/缩小时,它也只下载所需的图像。 5)这避免了在要求出现之前下载所有平铺图像。 6)所以甚至不需要后台进程。

    这可能需要一些时间,最初取决于网络连接,但我们无法通过预先下载所需的图像来改变这一点。

    我希望这适用于类似情况的人。

    湿婆

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多