首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GCD中运行MPMediaQuery

在GCD中运行MPMediaQuery
EN

Stack Overflow用户
提问于 2014-02-02 18:31:34
回答 1查看 535关注 0票数 0

下面的代码运行得很好,并给出了我正在寻找的结果。但是,我想在它自己的线程中运行它。MPMediaQuery线程安全吗?如果是的话,我做错了什么?

代码语言:javascript
复制
-(NSArray*) mediaItemsFromPersistentIds:(NSArray*) mediaPersistentIds
{
    if (debug==1) {
        NSLog(@"Running %@ '%@'", self.class, NSStringFromSelector(_cmd));
    }

       MPMediaQuery *mediaQuery = [MPMediaQuery new];
       NSArray *itemsmediaQuery = mediaQuery.items;
       NSPredicate *predicate   = [NSPredicate predicateWithFormat:@"%K IN %@", @"itemId", mediaPersistentIds];

    return [itemsmediaQuery filteredArrayUsingPredicate:predicate];
}

当我尝试以下方法时,我得到

由于“MPMediaItemCollectionInitException”异常终止应用程序,原因:“项数组不能为空”

我知道[itemsmediaQuery filteredArrayUsingPredicate:predicate]被返回为(null)

代码语言:javascript
复制
-(NSArray*) mediaItemsFromPersistentIds:(NSArray*) mediaPersistentIds
{
    if (debug==1) {
        NSLog(@"Running %@ '%@'", self.class, NSStringFromSelector(_cmd));
    }
    __block NSArray *itemsmediaQuery;
    __block NSPredicate *predicate;

    dispatch_queue_t mediaQueryQueue = dispatch_queue_create("media query", NULL);
    dispatch_async(mediaQueryQueue, ^{

        MPMediaQuery *mediaQuery      = [MPMediaQuery new];
        itemsmediaQuery = mediaQuery.items;
        predicate = [NSPredicate predicateWithFormat:@"%K IN %@", @"itemId", mediaPersistentIds];

    });

    return [itemsmediaQuery filteredArrayUsingPredicate:predicate];
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-02 19:09:35

在后台请求这些项目是安全的。

现在,您实际上并不是在后台运行查询。你可以这样做:

代码语言:javascript
复制
- (void)mediaItemsFromPersistentIds:(NSArray*)ids
                           callback:(void (^)(NSArray *items))callback {
    dispatch_queue_t mediaQueryQueue = dispatch_queue_create("media query", NULL);
    dispatch_async(mediaQueryQueue, ^{
        MPMediaQuery *mediaQuery = [MPMediaQuery new];
        itemsmediaQuery = mediaQuery.items;
        predicate = [NSPredicate predicateWithFormat:@"%K IN %@", @"itemId", ids];

        // Do the query
        NSArray *items = [itemsmediaQuery filteredArrayUsingPredicate:predicate];

        // Post the query results to the main thread in some way
        dispatch_async(dispatch_get_main_queue(), ^{
            // You could pass this off to a delegate or callback block
            if (callback)
                callback(items);
        });
    });
}

并称之为:

代码语言:javascript
复制
NSArray *ids = ...
[someObj mediaItemsFromPersistentIds:ids callback:^(NSArray *items) {
    // Do something with `items`
}];
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21514515

复制
相关文章

相似问题

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