2013-03-10 49 views
0

有關我需要使用ALAssetsLibrary:assetForURL加載照片的URL列表,以及此方法中的這一點。 由於此方法工作異步,但它不會遍歷URL的傳遞列表,因爲我們都知道。 我發現這個代碼段(應該工作):如何使用assetForURL加載幾張照片以及URL列表

- (void)loadImages:(NSArray *)imageUrls loadedImages:(NSArray *)loadedImages callback: (void(^)(NSArray *))callback 
{ 
if (imageUrls == nil || [imageUrls count] == 0) { 
    callback(loadedImages); 
} 
else { 
    NSURL *head = [imageUrls head]; 
    __unsafe_unretained id unretained_self = self;   
    ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init]; 
    [library assetForURL:head resultBlock:^(ALAsset *asset) { 
     ALAssetRepresentation *assetRepresentation = asset.defaultRepresentation; 

     UIImage *image = [UIImage imageWithCGImage:assetRepresentation.fullResolutionImage scale:assetRepresentation.scale orientation:(UIImageOrientation)assetRepresentation.orientation]; 

     [unretained_self loadImages:[imageUrls tail] loadedImages:[loadedImages arrayByAddingObject:image] callback:callback]; 
    } failureBlock:^(NSError *error) { 
     [unretained_self loadImages:[imageUrls tail] loadedImages:loadedImages callback:callback]; 
    }]; 
} 
} 

我怎樣寫的方法定義的形式(以上所有的回調)

void loadImages(NSArray *imageUrls, NSArray *loadedImages, ...) ? 

如何調用該方法從另一個方法(主要是回調部分)? 回調可以在調用方法或第三種方法需要嗎?以及這種方法如何編寫? 我發現這裏的片段:http://www.calebmadrigal.com/functional-programming-deal-asynchronicity-objective-c/

回答

1

使用NSThread調用loadImages方法。

NSMutableArray *imageCollection = [NSThread detachNewThreadSelector:@selector (loadImages:) 
         toTarget:self 
         withObject:imageUrlsCollection]; 


- (NSMutableArray *)loadImages:(NSArray *)imageUrls 
{ 
    ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init]; 
    NSMutableArray *loadedImages = [[NSMutableArray alloc] init]; 

    @try 
    { 
    for(int index = 0; index < [imageUrls count]; index++) 
    { 
     NSURL *url = [imageUrls objectAtIndex:index]; 

     [library assetForURL:url resultBlock:^(ALAsset *asset) { 

     ALAssetRepresentation *assetRepresentation = asset.defaultRepresentation; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      UIImage *image = [UIImage imageWithCGImage:assetRepresentation.fullResolutionImage scale:assetRepresentation.scale orientation:(UIImageOrientation)assetRepresentation.orientation]; 

      [loadedImages addObject:image]; 

      }); 

    } failureBlock:^(NSError *error) { 

      NSLog(@"Failed to get Image"); 
    }]; 

    } 
} 
@catch (NSException *exception) 
{ 
    NSLog(@"%s\n exception: Name- %@ Reason->%@", __PRETTY_FUNCTION__,[exception name],[exception reason]); 
} 
@finally 
{ 
    return loadedImages; 
} 

} 

注意:隨着ARC,照顧約無效試圖訪問ALAssetPrivate過去它擁有ALAssetsLibrary問題的壽命

Here is the fix :)

+0

謝謝Ramshad,看起來很有趣。這是否意味着當到達第一行下面的下一行時,數組imageCollection被填充,因此它實際上是一個同步調用? – valley 2013-03-11 07:58:18

+0

另一件事:因爲我不是在類中(我爲Adobe AIR編寫本機擴展,因此我的.m文件只是一組方法),當嘗試使用未聲明的標識符'self'時出現錯誤使用detachNewThreadSelector toTarget:self。我怎樣才能解決這個問題? – valley 2013-03-11 08:09:54

+0

第一行工作在一個單獨的線程上。所以它不會等待方法執行。如果您想等待執行此方法,請刪除NSSthread代碼,然後調用「[self loadImages:imageUrlsCollection];」 – 2013-03-11 09:47:28

0

沒有未工作。調用方法結束後loadImages()方法總是結束。至於你說的這是我現在要做的調用方法不NSThread:

loadImagesForUrls(urls, images); 
// here we should have items in images, but it is empty 
NSInteger numberOfPhotos = [images count]; 
NSString *result = [NSString stringWithFormat:@"%d",(int)numberOfPhotos]; 
// this is the async notifier to the AIR app that loading is finished 
FREDispatchStatusEventAsync(g_ctx, (const uint8_t*)"loadPhotoTypeThumbnailsForUrls", (uint8_t*)[result UTF8String]); 
NSLog(@"Exiting LoadPhotosForUrls() with %d loaded assets", numberOfPhotos); 

我記錄一切資產實際上addeed到圖像陣列的方法返回之後。 我沒有改變你在第一個答案中提出的方法。 這裏發生了什麼問題,或者我沒有正確理解什麼?

相關問題