2013-03-11 4 views
0

Я настраиваю источник xcode скроллера фотографии. для черепичных изображений я хочу загружать изображения с веб-сервера, используя nsoperation в фоновом режиме.CATiled Layer Async image download

приложение загружает изображения плитки правильно, но не обновляется. не уверен, как обновить черепичные изображения сразу после завершения загрузки. любые намеки будут оценены.


- (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 
    } 
} 

ответ

0

- (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) Таким образом, нет необходимости в фоновом процессе.

Это может занять некоторое время, первоначально основанное на сетевом соединении, но мы не можем изменить это, предварительно загрузив требуемые изображения.

Надеюсь, это сработает для кого-то подобного сценария.

Siva