0

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

@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. 我将所有这些放在我的 ViewController 的 ViewDidLoad 中:

- (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,而在 Block 的范围内,它显示计数在增加,并且在两个调用之间持续存在(正如我所预料的那样)。我还觉得奇怪的是,资产计数:0 行应该出现在日志中的更晚,或者查看资产的行(从块内调用)应该更早发生:

2011-02-21 14:22:59.140 iPCS[7219:207] 资产计数:0
2011-02-21 14:23:08.539 iPCS[7219:207] 资产计数:0

2011-02-21 14:14:03.363 iPCS[7139:207] 参见资产:ALAsset - 类型:照片,URL:{ "public.jpeg" = "assets-library://asset/asset.JPG?id=1000000001&ext =JPG"; }
2011-02-21 14:14:03.363 iPCS[7139:207] 资产计数:1

2011-02-21 14:14:03.365 iPCS[7139:207] 参见资产:ALAsset - 类型:照片,URL:{“public.jpeg”=“assets-library://asset/asset.JPG?id=1000000002&ext =JPG"; }
2011-02-21 14:14:03.366 iPCS[7139:207] 资产数量:2

2011-02-21 14:14:03.367 iPCS[7139:207] AssetEnum:结果为零或列表结束
2011-02-21 14:14:03.367 iPCS[7139:207] GroupEnum 中的资产计数:2
2011-02- 21 14:14:03.368 iPCS[7139:207] GroupEnum:组 nil 或列表末尾
2011-02-21 14:14:03.368 iPCS[7139:207] GroupEnum 中的资产计数:2

2011-02-21 14:14:03.370 iPCS[7139:207] 参见资产:ALAsset - 类型:照片,URL:{“public.jpeg”=“assets-library://asset/asset.JPG?id=1000000001&ext =JPG"; 2011-02-21 14:14: 03.371
iPCS[7139:207] 资产数量:3

2011-02-21 14:14:03.373 iPCS[7139:207] 参见资产:ALAsset - 类型:照片,URL:{“public.jpeg”=“assets-library://asset/asset.JPG?id=1000000002&ext =JPG"; }
2011-02-21 14:14:03.374 iPCS[7139:207] 资产数量:4

2011-02-21 14:14:03.374 iPCS[7139:207] AssetEnum:结果为零或列表结束
2011-02-21 14:14:03.375 iPCS[7139:207] GroupEnum 中的资产计数:4
2011-02- 21 14:14:03.375 iPCS[7139:207] GroupEnum:组 nil 或列表末尾
2011-02-21 14:14:03.376 iPCS[7139:207] GroupEnum 中的资产计数:4

大家怎么说?

编辑:再进行一些测试,并usingAssets使用视图上的按钮调用,assets数组已正确填充!这意味着在加载时,在viewDidLoad块中看到的对象与在块的调用实例中看到的对象之间存在某种断开连接。任何人都对它为什么表现出这种行为有任何想法?

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

4

1 回答 1

1

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

if(group == nil) { 
    NSLog('Assets finished renumerating, %i found', [self.assets count]); 
} else { 
    [group enumerate...]; 
}

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

于 2011-04-10T19:36:17.227 回答