首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查AVMetadataItem项目(如标题、艺术家等)是否为空或不存在?

如何检查AVMetadataItem项目(如标题、艺术家等)是否为空或不存在?
EN

Stack Overflow用户
提问于 2018-03-15 22:38:46
回答 1查看 903关注 0票数 0

我正在构建一个音乐应用程序,我试图用这段代码获取MP3文件元数据:

代码语言:javascript
复制
for (NSString *format in [assest availableMetadataFormats]) {

        for (AVMetadataItem *item in [assest metadataForFormat:format]) {
            if ([[item commonKey] isEqualToString:@"title"]) {

                [SongNameMutableArray addObject:[NSString stringWithFormat:@"%@",[item value]]];
            }
            if ([[item commonKey] isEqualToString:@"artist"]) {

                [ArtistMutableArray addObject:[NSString stringWithFormat:@"%@",[item value]]];
            }
            if ([[item commonKey] isEqualToString:@"albumName"]) {

            }
            if ([[item commonKey] isEqualToString:@"artwork"]) {
                UIImage *img = nil;
                if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) {
                    img = [UIImage imageWithData:item.dataValue];

                }
                else {
                    NSDictionary *dict ;
                    [item.value copyWithZone:nil];
                    img = [UIImage imageWithData:[dict objectForKey:@"data"]];

                }
            }
        }
    }

密码很好用。唯一的情况是,当可变数组被填充时,它们会按照以下方式进行填充:

  • SongNameMutableArray => song1,song2,song3,songX;
  • ArtistMutableArray => Artists1,Artist3,Artist 10,ArtistX;

因为并非所有的歌曲都有一个艺术家在元数据中。

根据代码的这个特定部分

代码语言:javascript
复制
if ([[item commonKey] isEqualToString:@"artist"]) {
    [ArtistMutableArray addObject:[NSString stringWithFormat:@"%@",[item value]]];
}

如果找到的项目是艺术家,则将其插入数组中。

现在我的问题是,当一首歌在元数据中没有艺术家时,如何检测?这样我就可以在ArtistMutableArray => Artists1中插入"null“,null,Artist3,null,Artist 5,ArtistX;

我尝试过的

代码语言:javascript
复制
if ([[item commonKey] isEqualToString:@"null"])
if ([[item value] isEqualToString:@"null"])

我不知道我在这里错过了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-15 23:13:51

你所做的每一件事都需要做不同的事情。不要将数据分割成单独的数组,特别是如果您希望每个数组具有相同数量的元素,并且每个相应的索引都引用相同的资产。

相反,定义一个类,其中包含要跟踪的每个资产的几个属性。然后有一个这些类实例的数组。然后无需担心保持多个数组的同步,并通过在需要时向数组中添加"null“值来执行技巧。

拥有一个数据数组还有许多其他好处。例如,排序。例如,通过拥有一个数组,您可以按艺术家对数据数组进行排序。在排序或过滤时试图保持多个数组的同步是一个巨大的痛苦。

因为您只获得了常见的元数据,所以不需要对所有格式进行迭代并查看每种格式的属性。只需使用资产的commonMetadata属性即可。

获取commonKey值时,不要将其与硬编码字符串进行比较。使用API提供的常量,如AVMetadataCommonKeyAlbumName

由于每个元数据项只能有一个commonKey值,所以使用if/else可以提高代码的效率。并使用元数据项的stringValue属性获得字符串值,而不是使用stringWithFormat

这里是元数据类的一个开始。请按您认为合适的名称命名,并添加所需的任何其他属性。

代码语言:javascript
复制
@interface MyMetaData: NSObject

@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *artist;
@property (nonatomic, copy) NSString *albumName;
@property (nonatomic, copy) UIImage *artwork;

@end

@implementation MyMetaData
@end

下面是您在问题中发布的代码的替代品:

代码语言:javascript
复制
NSMutableArray *metadata = [NSMutableArray array]; // your array of obtained metadata

AVAsset *asset = // some asset

MyMetaData *data = [[MyMetaData alloc] init];

NSArray *commonData = asset.commonMetadata;
for (AVMetadataItem *item in commonData) {
    AVMetadataKey key = item.commonKey;
    if ([key isEqual: AVMetadataCommonKeyTitle]) {
        data.title = item.stringValue;
    } else if ([key isEqual:AVMetadataCommonKeyArtist]) {
        data.artist = item.stringValue;
    } else if ([key isEqual:AVMetadataCommonKeyAlbumName]) {
        data.albumName = item.stringValue;
    } else if ([key isEqual:AVMetadataCommonKeyArtwork]) {
        data.artwork = // your code to get the image
    }
}

[metadata addObject:data];

这要干净得多,您现在只有一个数组需要处理。如果给定的资产没有数据,比如说艺术家,那么这个值只是在给定的nil实例上保持为MyMetaData

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49310363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档