首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 4资源库问题: NSMutableArray在块中包含数据,但在块调用后为空

iOS 4资源库问题: NSMutableArray在块中包含数据,但在块调用后为空
EN

Stack Overflow用户
提问于 2011-02-22 03:29:56
回答 1查看 1.6K关注 0票数 0

我正在尝试将http://www.icodeblog.com/asset-libraries-and-blocks-in-ios-4/上的示例整合到我自己的应用程序中。这就是我到目前为止所知道的:

代码语言:javascript
复制
@interface UserTabBarController : UIViewController <NSFetchedResultsControllerDelegate, UITabBarDelegate> {
    NSMutableArray *assets;
}
    -(void)usingAssets;
@end

@implementation UserTabBarController
    -(void)usingAssets{

        void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
            if(result != NULL) {
            NSLog(@"See Asset: %@", result);
            [assets addObject:result];
            NSLog(@"assets count: %i", assets.count);
            }
            else {
            NSLog(@"AssetEnum: result nil or end of list");
            }
        };

        void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) {
        if(group != nil) {
            [group enumerateAssetsUsingBlock:assetEnumerator];
            }
            else {
            NSLog(@"GroupEnum: group nil or end of list");
            }
            NSLog(@"assets count in GroupEnum: %i", assets.count);
    };


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

        [library enumerateGroupsWithTypes:ALAssetsGroupAll
                               usingBlock:assetGroupEnumerator
                                failureBlock: ^(NSError *error) {
                   NSLog(@"Failure: %@", error.description);
            }];
        [library release];
    }

让我们(希望)同意,每次我调用usingAssets时,我都会将相册的最新内容添加到NSMutableArray* assets中。我在我的视图控制器的ViewDidLoad中把所有这些放在一起:

代码语言:javascript
复制
- (void)viewDidLoad {
    [super viewDidLoad];
    assets = [[NSMutableArray alloc] init];
    [self usingAssets];
    for (ALAsset* a in self.assets){
        NSLog(@"Item in asset");
    }
    NSLog(@"Asset count: %i", assets.count);

    [self usingAssets];
    NSLog(@"Asset count: %i", assets.count);

}

到目前为止,我相信我已经遵循了上面链接中显示的示例。问题是在UserTabBarController的作用域中,assets.count保持为0,而在块的作用域中,它显示计数在增加,并且在两个调用之间保持不变(正如我所预期的那样)。我还发现奇怪的是,行Asset count: 0应该在日志中出现得更晚,或者看到资产(从块中调用)的行应该更早出现:

2011-02-21 14:22:207iPCS7219:59.140资产数量:0

2011-02-21 14:23:207iPCS7219:08.539资产数量:0

2011-02-21 14:14:03.363 iPCS7139:03.363参见资产:"assets-library://asset/asset.JPG?id=1000000001&ext=JPG";-类型:照片,URL:{ "public.jpeg“=iPCS7139}

2011-02-21 14:14:03.363 iPCS7139:207资产数量:1

2011-02-21 14:14:03.365 iPCS7139:03.365参见资产:"assets-library://asset/asset.JPG?id=1000000002&ext=JPG";-类型:照片,URL:{ "public.jpeg“=iPCS7139}

2011-02-21 14:14:03.366 iPCS7139:207资产数量:2

2011-02-21 14:14:03.367 iPCS7139:03.367 AssetEnum:结果为空或列表结束

2011-02-21 14:14:03.367 iPCS7139:03.367资产数量单位: GroupEnum: 2

2011-02-21 14:14:03.368 iPCS7139:03.368 GroupEnum:分组为空或列表结束

2011-02-21 14:14:03.368 iPCS7139:03.368资产数量单位: GroupEnum: 2

2011-02-21 14:14:03.370 iPCS7139:03.370参见资产:"assets-library://asset/asset.JPG?id=1000000001&ext=JPG";-类型:照片,URL:{ "public.jpeg“=iPCS7139}

2011-02-21 14:14:03.371 iPCS7139:207资产数量:3

2011-02-21 14:14:03.373 iPCS7139:03.373参见资产:"assets-library://asset/asset.JPG?id=1000000002&ext=JPG";-类型:照片,URL:{ "public.jpeg“=iPCS7139}

2011-02-21 14:14:03.374 iPCS7139:207资产数量:4

2011-02-21 14:14:03.374 iPCS7139:03.374 AssetEnum:结果为空或列表结束

2011-02-21 14:14:03.375 iPCS7139:207Assets count in GroupEnum: 4

2011-02-21 14:14:03.375 iPCS7139:03.375 GroupEnum:分组为空或列表结束

2011-02-21 14:14:03.376 iPCS7139:207Assets count in GroupEnum: 4

你们都怎么说?

编辑:又运行了几个测试,并使用视图上的一个按钮调用了usingAssetsassets数组已正确填充!这意味着在加载时,在viewDidLoad期间,在块中看到的对象和在块的调用实例中看到的对象之间存在某种类型的断开。有谁知道为什么它会表现出这种行为?

编辑2:我已经玩了一个多星期的代码了,但我仍然无法让assets NSArray准确地显示内容。我已经确定它必须与块的执行顺序相关联。当我调用usingAssets时,方法本身就完成了,但是这些块不会立即运行。因此,假设我将该方法绑定到一个按钮,并立即打印assets的内容,它是空的(我在库中有2个图像)。我再次点击按钮,现在内容显示了2个项目。如果我第三次单击它,它会显示4。这几乎就像是在控制返回给用户(返回到应用程序循环)之后运行的块。我即将放弃,放弃我的assets代码,只根据它们所在的路径加载它们,但我更愿意使用assets,如果我能找出为什么它的行为不像预期的话

EN

回答 1

Stack Overflow用户

发布于 2011-04-11 03:36:17

我为此所做的,是检查组何时为空,以查看它何时完成枚举,然后您可以检查计数...

代码语言:javascript
复制
if(group == nil) { 
    NSLog('Assets finished renumerating, %i found', [self.assets count]); 
} else { 
    [group enumerate...]; 
}

此外,如果您将资源用作属性,则始终使用self.assets,以便其得到更新。这段代码现在可以为我工作了:)

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

https://stackoverflow.com/questions/5070331

复制
相关文章

相似问题

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