0

URL のリストについては、ALAssetsLibrary:assetForURL を使用して写真を読み込む必要があり、これを 1 つのメソッド内で行います。このメソッドは非同期で動作しますが、渡された 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, ...)  ?

このメソッドを別のメソッド (主にコールバック部分) から呼び出すにはどうすればよいですか? コールバックは、呼び出し元のメソッドまたはこれに必要な 3 番目のメソッドに含めることができますか? また、このメソッドをどのように記述する必要がありますか? ここでスニペットを見つけました: http://www.calebmadrigal.com/functional-programming-deal-asynchronicity-objective-c/

4

1 に答える 1

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では、所有しているALAssetsLibraryの問題の存続期間を超えてALAssetPrivateにアクセスしようとする無効な試みに注意してください。

これが修正です:)

于 2013-03-10T22:58:04.057 に答える