2

我使用 ALAssetLibrary 在我的模拟器中找到了一些有关图像的信息。我可以使用 NSLog 正确显示这些信息,但我不知道如何将这些信息保存在列表中。我正在使用的代码是这样的:

NSMutableArray *list = [[NSMutableArray alloc] init];
ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    if (group) {
        [group setAssetsFilter:[ALAssetsFilter allPhotos]];
        [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop){
            if (asset){
                NSString *description = [asset description];
                NSRange first = [description rangeOfString:@"URLs:"];
                NSRange second = [description rangeOfString:@"?id="];
                NSString *path = [description substringWithRange: NSMakeRange(first.location + first.length, second.location - (first.location + first.length))];
                NSLog(@"Path: %@", path);
                [list addObject:path];
                NSDictionary *data = [[asset defaultRepresentation] metadata];
                NSNumber *width = [[[asset defaultRepresentation] metadata] objectForKey:@"PixelWidth"];
                NSString *widthString = [NSString stringWithFormat:@"%@", width];
            }
        }];
    }
} failureBlock:^(NSError *error) {
    NSLog(@"error enumerating AssetLibrary groups %@\n", error);
}];
NSLog(@"LIST: %@", list);

据我了解,这些操作是异步工作的,所以我不知道如何保存它们。任何想法?

谢谢

4

3 回答 3

1

为什么不只创建一个可变数组,并在每次通过枚举时将您关心的值导出到数组中。这样,您将拥有易于访问的项目索引列表。这是一个例子:

NSMutableArray *myContainerArray = [NSMutableArray new];

ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    if (group) {
        [group setAssetsFilter:[ALAssetsFilter allPhotos]];
        [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop){
            if (asset){
                NSString *description = [asset description];
                NSRange first = [description rangeOfString:@"URLs:"];
                NSRange second = [description rangeOfString:@"?id="];
                NSString *path = [description substringWithRange: NSMakeRange(first.location + first.length, second.location - (first.location + first.length))];
                NSLog(@"Path: %@", path);

                NSNumber *width = [[[asset defaultRepresentation] metadata] objectForKey:@"PixelWidth"];
                NSString *widthString = [NSString stringWithFormat:@"%@", width];

                [myContainerArray addObject:widthString];
            }
        }];
    }
} failureBlock:^(NSError *error) {
    NSLog(@"error enumerating AssetLibrary groups %@\n", error);
}];

现在请记住,我为此示例创建了一个局部变量,您需要创建一个更大的范围才能在其他地方访问该数组。然后,您可以使用[array objectAtIndex:i];或使用现代 Objective C 语法通过索引访问数组的元素array[i];

于 2013-08-26T13:29:50.537 回答
1

最后,我使用以下代码解决了问题:

NSMutableArray *idList = [[NSMutableArray alloc] init];
NSMutableArray *widthList = [[NSMutableArray alloc] init];
NSMutableArray *heightList = [[NSMutableArray alloc] init];
NSMutableArray *orientationList = [[NSMutableArray alloc] init];
NSMutableArray *dateList = [[NSMutableArray alloc] init];

__block ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
__block NSString *description = [[NSString alloc] init];

[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    if (group) {
        [group setAssetsFilter:[ALAssetsFilter allPhotos]];
        [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop){
            if (asset){
                NSString *description = [asset description];
                NSLog(@"description %@", description);
                NSRange first = [description rangeOfString:@"URLs:"];
                NSRange second = [description rangeOfString:@"?id="];
                NSString *path = [description substringWithRange: NSMakeRange(first.location + first.length, second.location - (first.location + first.length))];
                [idList addObject:path];

                NSDictionary *data = [[asset defaultRepresentation] metadata];

                NSNumber *width = [[[asset defaultRepresentation] metadata] objectForKey:@"PixelWidth"];
                NSString *widthString = [NSString stringWithFormat:@"%@", width];
                [widthList addObject:widthString];

                NSNumber *height = [[[asset defaultRepresentation] metadata] objectForKey:@"PixelHeight"];
                NSString *heightString = [NSString stringWithFormat:@"%@", height];
                [heightList addObject:heightString];

                NSNumber *orientation = [[[asset defaultRepresentation] metadata] objectForKey:@"Orientation"];
                NSString *orientationString = [NSString stringWithFormat:@"%@", orientation];
                if(orientationString != NULL){
                    [orientationList addObject:orientationString];
                } else {
                    NSString *noOrientation = [[NSString alloc] init];
                    noOrientation = @"No orientation avaiable";
                    [dateList addObject:noOrientation];
                }

                NSString *dateString = [[[asset defaultRepresentation] metadata] objectForKey:@"DateTime"];
                if(dateString != NULL){
                    [dateList addObject:dateString];
                } else {
                    NSString *noDate = [[NSString alloc] init];
                    noDate = @"No date avaiable";
                    [dateList addObject:noDate];
                }
            }
        }];
    }
    if (group == nil){
        XMLWriter* xmlWriter = [[XMLWriter alloc]init];
        [xmlWriter writeStartDocumentWithEncodingAndVersion:@"UTF-8" version:@"1.0"];
        [xmlWriter writeStartElement:@"Data"];
        int i = 0;
        for(i = 0; i<=[idList count]-1; i++){
            NSLog(@"width: %@", [widthList objectAtIndex:i]);
            [xmlWriter writeStartElement:@"Photo"];
            [xmlWriter writeAttribute:@"Id" value:[idList objectAtIndex:i]];
            [xmlWriter writeAttribute:@"Width" value:[widthList objectAtIndex:i]];
            [xmlWriter writeAttribute:@"Height" value:[heightList objectAtIndex:i]];
            [xmlWriter writeAttribute:@"Orientation" value:[orientationList objectAtIndex:i]];
            [xmlWriter writeAttribute:@"Date" value:[dateList objectAtIndex:i]];
            [xmlWriter writeEndElement:@"Photo"];
        }
        [xmlWriter writeEndElement:@"Data"];
        [xmlWriter writeEndDocument];
        NSString* xml = [xmlWriter toString];
        NSLog(@"XML: %@", xml);
    }

} failureBlock:^(NSError *error) {
    NSLog(@"error enumerating AssetLibrary groups %@\n", error);
}];

在这种模式下,我还编写了如何使用 Xml Stream Writer ( https://github.com/skjolber/xswi ) 编写 xml 的信息。希望这会有所帮助。

于 2013-08-26T16:15:32.887 回答
0

您可以在库块之外制作 nsmutablearray 的对象,并在块内的数组中添加对象。

-(void)videoList{

RemainingVideo=[[NSMutableArray alloc] initWithCapacity:0];

 ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];


[assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop){
     if (group)
     {
         [group setAssetsFilter:[ALAssetsFilter allVideos]];
         [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop)
          {

              NSString *GroupName=[group valueForProperty:ALAssetsGroupPropertyName];

              if ([GroupName isEqualToString:@"waiting"])
              {
                  if (asset)
                  {
                      NSMutableDictionary *dic=[[NSMutableDictionary alloc] init];
                      ALAssetRepresentation *defaultRepresentation = [asset defaultRepresentation];
                      NSString *uti = [defaultRepresentation UTI];
                      NSURL  *videoURL = [[asset valueForProperty:ALAssetPropertyURLs] valueForKey:uti];
                      NSString *title = [NSString stringWithFormat:@"video %d", arc4random()%100];
                      [dic setValue:title forKey:@"name"];
                      [dic setValue:videoURL forKey:@"url"];

                      [RemainingVideo addObject:dic];

                      if (RemainingVideo.count == 0)
                      {
                          [UploadRemainig setTitle:[[NSString alloc] initWithFormat:@"No video found."] forState:UIControlStateNormal];
                      }
                      else
                      {
                          [UploadRemainig setTitle:[[NSString alloc] initWithFormat:@"%d video waiting for upload..",RemainingVideo.count] forState:UIControlStateNormal];
                      }
                  }
              }
              else
              {
                  [UploadRemainig setTitle:[[NSString alloc] initWithFormat:@"No video found."] forState:UIControlStateNormal];
              }
          }];

         NSLog(@"total videos:%d",RemainingVideo.count);
     }
     else
     {
         [UploadRemainig setTitle:[[NSString alloc] initWithFormat:@"No video found."] forState:UIControlStateNormal];
     }
 }
failureBlock:^(NSError *error)
 {
     NSLog(@"error enumerating AssetLibrary groups %@\n", error);
 }];

}

于 2013-08-26T13:30:21.583 回答