gpt4 book ai didi

cocoa-touch - 尝试从 assetForURL :resultBlock: 内部分配 __block ALAsset 时出错

转载 作者:行者123 更新时间:2023-12-04 17:26:52 24 4
gpt4 key购买 nike

我正在尝试创建一个方法,该方法将为给定的 Assets url 返回一个 ALAsset。 (我需要稍后上传 Assets ,并希望在结果块之外使用结果进行上传。)

+ (ALAsset*) assetForPhoto:(Photo*)photo
{
ALAssetsLibrary* library = [[[ALAssetsLibrary alloc] init] autorelease];
__block ALAsset* assetToReturn = nil;

NSURL* url = [NSURL URLWithString:photo.assetUrl];
NSLog(@"assetForPhoto: %@[", url);

[library assetForURL:url resultBlock:^(ALAsset *asset)
{
NSLog(@"asset: %@", asset);
assetToReturn = asset;
NSLog(@"asset: %@ %d", assetToReturn, [assetToReturn retainCount]);

} failureBlock:^(NSError *error)
{
assetToReturn = nil;
}];

NSLog(@"assetForPhoto: %@]", url);
NSLog(@"assetToReturn: %@", assetToReturn); // Invalid access exception coming here.

return assetToReturn;
}

问题是 assetToReturn 给出了 EXC_BAD_ACCESS。

如果我尝试从块内部分配指针,是否有问题?我看到了一些块的例子,但它们总是具有简单的类型,如整数等。

最佳答案

一些东西:

  • 必须保留 ALAssetsLibrary周围的实例创建了 ALAsset只要您使用 Assets 。
  • 必须ALAssetsLibraryChangedNotification 注册一个观察者, 当收到任何 ALAsset您拥有的任何其他 AssetsLibrary 对象将需要重新获取,因为它们将不再有效。这可能随时发生。
  • 不应该期待 -assetForURL:resultBlock:failureBlock: ,或任何带有 failureBlock: 的 AssetsLibrary 方法是同步的。他们可能需要提示用户访问库,并且不会总是立即执行他们的块。最好将需要成功发生的操作放在成功块本身中。
  • 只有当您绝对必须在您的应用程序中同步此方法时(我建议您不要这样做),您才需要在调用 assetForURL:resultBlock:failureBlock: 后等待信号量。如果最终阻塞主线程,则可以选择旋转 runloop。


  • 下面的实现应该满足所有情况下的同步调用,但实际上,您应该非常努力地使您的代码异步。
    - (ALAsset *)assetForURL:(NSURL *)url {
    __block ALAsset *result = nil;
    __block NSError *assetError = nil;
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);

    [[self assetsLibrary] assetForURL:url resultBlock:^(ALAsset *asset) {
    result = [asset retain];
    dispatch_semaphore_signal(sema);
    } failureBlock:^(NSError *error) {
    assetError = [error retain];
    dispatch_semaphore_signal(sema);
    }];


    if ([NSThread isMainThread]) {
    while (!result && !assetError) {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }
    }
    else {
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    }

    dispatch_release(sema);
    [assetError release];

    return [result autorelease];
    }

    关于cocoa-touch - 尝试从 assetForURL :resultBlock: 内部分配 __block ALAsset 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7625402/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com