2015-08-08 61 views
1

陣列我從解析數據庫中存儲的圖像是這樣的:如何創建UIImages

PFFile *firstImageFile = self.product[@"firstThumbnailFile"]; 
[firstImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) { 
    if (!error) { 
     self.firstImage = [UIImage imageWithData:imageData]; 
    } 
}]; 

我想將圖像保存爲一個數組,以顯示他們一個滾動視圖中。

它的工作原理,如果我做這樣的事情:

self.galleryImages = [NSArray arrayWithObjects: [UIImage imageNamed:@"s2.jpg"], [UIImage imageNamed:@"s1.jpg"], nil]; 

但是,如果我嘗試使用UIImage的本身,沒有出現圖像。

self.galleryImages = [NSArray arrayWithObjects: self.firstImage, self.secondImage, nil]; 

任何幫助?謝謝。

+1

您確定'self.firstImage'和'self.secondImage'在您嘗試創建數組時是非零嗎? – rmaddy

+0

它看起來並不像它。我怎樣才能確定不是零? @rmaddy – chrisbedoya

+0

查看調試器中的值或在創建陣列之前將其記錄下來。 – rmaddy

回答

0

我猜(根據你對以上無意見),你的代碼看起來有點像這樣:

PFFile *firstImageFile = self.product[@"firstThumbnailFile"]; 
[firstImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) { 
    if (!error) { 
     self.firstImage = [UIImage imageWithData:imageData]; 
    } 
}]; 

self.galleryImages = [NSArray arrayWithObjects: self.firstImage, self.secondImage, nil]; 

如果是這樣的情況下,將數組初始化完成塊中,像這樣:

PFFile *firstImageFile = self.product[@"firstThumbnailFile"]; 
[firstImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) { 
    if (!error) { 
     self.firstImage = [UIImage imageWithData:imageData]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

       self.galleryImages = [NSArray arrayWithObjects: self.firstImage, self.secondImage, nil]; 
      }); 
    } 
}]; 

第一(你的)情況下,會發生什麼情況是,數組初始化語句完成塊之前運行,所以,當「第一形象」實際上是把它作爲數組已經初始化爲時已晚。

+0

我認爲你有正確的想法,但是沒有必要派發到完成塊中的主體......它將在沒有這個的情況下在主體上運行。更重要的是,'self.secondImage'假設它處於與第一個圖像相同的狀態,也將是零。它也必須加載。一種常用的方法是將第二個負載嵌套在第一個負載的完成塊內,這對於小的固定數量的操作來說很好。我建議採用更一般的方法。 – danh

1

這是一個常見問題的形式:如何做很多異步操作(沒有深度嵌套完成塊)並知道它們何時完成。我使用的方法是考慮的參數來操作的待辦事項列表,並建立一個遞歸處理列表的方法....

- (void)loadPFFiles:(NSArray *)array filling:(NSMutableDictonary *)results completion:(void (^)(BOOL))completion { 
    NSInteger count = array.count; 
    // degenerate case is an empty array which means we're done 
    if (!count) return completion(YES); 

    // otherwise, do the first operation on the to do list, then do the remainder 
    PFFile *file = array[0]; 
    NSArray *remainder = [array subarrayWithRange:NSMakeRange(0, count-1)]; 

    [file getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) { 
     if (!error) { 
      UIImage *image = [UIImage imageWithData:imageData]; 
      results[file.name] = image; 
      [self loadPFFiles:remainder filling:results completion:completion]; 
     } else { 
      completion(NO); 
     } 
    }]; 
} 

這樣稱呼它(猜測模型中的點點):

NSArray *pfFiles = @[ self.product[@"firstThumbnailFile"], self.product[@"secondThumbnailFile"] ]; 
NSMutableDictionary *result = [@{} mutableCopy]; 

[self loadPFFiles:pfFiles filling:result completion:^(BOOL success) { 
    if (success) { 
     // result will be an dictionary of the loaded images 
     // indexed by the file names 
    } 
}];