iphone - 使用 [ALAssetsLibrary enumerateGroupsWithTypes :] 时的 Cocoa 线程同步

标签 iphone objective-c cocoa-touch nslock

我最近和一些人一样,发现[ALAssetsLibrary enumerateGroupsWithTypes] 喜欢在另一个线程上运行它的 block 。苹果没有记录这一点真是太可惜了:-)

在我目前的情况下,我需要等待枚举完成,然后主线程才能返回任何结果。我显然需要某种线程同步。

我读过有关 NSLock 和 NSConditionLock 的内容,但似乎还没有任何内容符合“向阻塞的线程发出信号,表明该工作线程已完成”的要求。这似乎是一个足够简单的需求 - 谁能指出我正确的方向?

一如既往地欢迎你的线索和嘘声,

M.

最佳答案

框架不会在单独的线程上运行这些 block 。它只是将它们作为同一运行循环中的附加事件运行。为了证明这一点,试试这个

    [library enumerateGroupsWithTypes:ALAssetsGroupAll 
                           usingBlock:[^(ALAssetsGroup * group, BOOL * stop)
                             {
                               if([NSThread isMainThread])
                               {
                                  NSLog(@"main");
                               }
                               else
                               {
                                 NSLog(@"non-main");
                               }
                             } copy] 
           failureBlock:^(NSError * err)
                          {NSLog(@"Erorr: %@", [err localizedDescription] );}];
    [library release];
    if([NSThread isMainThread])
    {
        NSLog(@"main");
    }
    else
    {
        NSLog(@"non-main");
    }

我的输出是

main
main
main

意味着该 block 在主线程中被调用。这只是一个单独的事件。 要解决您的问题,您只需要在到达最后一步时以某种方式从 block 内返回您的值。你可以看出这是最后一步,因为你的 block 将使用 nil 为组对象调用。

编辑:例如使用这个 block

^(ALAssetsGroup * group, BOOL * stop)
{
    if(group == nil)
    {
        // we've enumerated all the groups 
        // do something to return a value somehow (maybe send a selector to a delegate)
    }
}

关于iphone - 使用 [ALAssetsLibrary enumerateGroupsWithTypes :] 时的 Cocoa 线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3586911/

相关文章:

iphone - 字幕和静态 UILabel 文本

objective-c - 在 Obj-C 中使用用户名定义全局常量

objective-c - Objective-C : How to release delegates in this situation

iPhone - 找不到 stdint.h 文件!

ios - 如何确定 NSDate 是否是今天?

iphone - MPMoviePlayer 控制风格

iphone - 如何在PDF文档上设置注释,此注释不仅对特定应用程序可见,而且对所有PDF阅读器可见

Xcode 6.4 中的 iOS 模拟器显示多个版本并且名称中有长 "id"

ios - 旋转和裁剪 UIImage

ios - Apple在这里使用什么控件? (包括截图)UIButton? UITableViewCell?还有别的吗?