0

以下代码运行良好,并为我提供了我正在寻找的结果。但是,我想在它自己的线程中运行它。MPMediaQuery 线程是否安全,如果是,我做错了什么?

-(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)

-(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];
}
4

1 回答 1

2

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

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

- (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);
        });
    });
}

并称之为:

NSArray *ids = ...
[someObj mediaItemsFromPersistentIds:ids callback:^(NSArray *items) {
    // Do something with `items`
}];
于 2014-02-02T19:09:35.033 回答