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

2024-04-29

我正在尝试创建一个方法,该方法将返回给定资产 url 的 ALAsset。 (我需要稍后上传资产,并希望在结果块之外执行此操作。)

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

问题是资产返回给出 EXC_BAD_ACCESS。

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


一些东西:

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

以下实现应该满足所有情况下的同步调用,但实际上,您应该努力使代码异步。

- (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];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试从 assetForURL:resultBlock 内部分配 __block ALAsset 时出错: 的相关文章

  • iPhone SDK - 在后台线程中运行重复进程

    我有一个iPhone我想在其中每隔一段时间在后台执行一个方法的应用程序1第二 所以在我的主线程中 我有以下代码UIViewController viewDidLoad NSTimer timerWithTimeInterval 1 0 ta
  • 为什么 UIWebView 吃这么多内存?

    我正在使用 UIWebView 为我的 iPad 应用程序加载纯文本 HTML 页面 HTTP页面的大小只有40KB 但是当我使用仪器监控加载 UIWebView 的内存使用情况时 我发现它消耗了大约 20MB 内存 如果我滚动 Web 视
  • Xcode 愚蠢警告:视图正在裁剪其内容

    我在 Xcode 4 中收到这个愚蠢的警告 Clipped Content View is clipping its content 如果我创建一个无边框斜角按钮 其图像大于按钮本身 为什么 我怎样才能抑制它 我也遇到了类似的灰色警告问题
  • iOS 5 Twitter 框架和completionHandler 块 - “在此块中强烈捕获‘自我’可能会导致保留周期”

    我对编程和 Objective C 非常陌生 我正在尝试找出我的代码出了什么问题 我已经阅读了一些有关块的内容 但我不知道到目前为止我所阅读的内容与我的代码有何相关 我的代码使用 iOS 5 Twitter 框架 我使用了 Apple 提供
  • 使用“dispatch_async(dispatch_get_main_queue(),^{block})”更新UI

    我想更新 NSURLSession 的完成块中的 UI 最初的实现并没有立即更新 UI 大约 20 秒后它更新了 UI 这是最初的实现 NSURLSessionDataTask task self session dataTaskWithR
  • iOS 非矩形图像裁剪? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么我不能同时在 viewWillAppear:animated 中调用 reloadData 和 deselectRowAtIndexPath ?

    我有一个 UITableView 其中的单元格在选择时将 viewControllers 推入堆栈 子视图控制器接受用户输入 然后从堆栈中弹出 当子 viewController 弹出时 我希望父 tableView 更新所选单元格的值 然
  • sizeWithFont: 的替代方法

    我有一堂课 其工作是将文本解析为几页 我使用 sizeWithFont 方法来识别一页何时结束而另一页何时开始 但不幸的是 由于需要解析的文本量相当大 整个操作需要在后台线程上执行 需要几秒钟才能完成 因此 有时我的界面上会出现视觉伪影 U
  • UIDatePicker 仅显示月份和日期

    我想要一个UIDatePicker用户可以选择月份和日期 但不能选择年份 我知道闰年有额外的一天 所以为了简单起见 让我们把这一天扔掉 有没有办法删除年份列或有 2 个带有月 日的卷轴 其作用类似于UIDatePicker 所选月份中不存在
  • 应用内购买“无法连接到 iTunes Store”

    我在测试应用内购买时遇到问题 我取回了有效的产品标识符 但在购买后我收到了可怕的 无法连接到 iTunes Store 有趣的是 恢复购买似乎有效 会弹出 iTunes 登录 我有 检查我的应用内购买是否已批准出售 检查 重新检查我的源代码
  • 不使用 ARC 时替换 __weak

    我有这行代码 weak NSBlockOperation weakOperation operation 这是触发此编译器错误 weak attribute cannot be specified on automatic variable
  • 使用 swift 自动滚动 UITextView (IOS 应用程序)

    我似乎无法找到自动滚动的正确解决方案UITextView using Swift 对于我的应用程序 我从 BT 接收持续数据 并且我正在更新它UITextView 然而 当UITextView将到达最新更新的行 我将不得不手动滚动 我想要实
  • Objective-C 继承中@synthesize/@property 的使用

    如果您有一个带有实例变量 foo 的类 A 该类具有 property synthesize 指令 并且类 B 继承自类 A 那么它是否还需要 property synthesize foo 我问的原因是因为当我尝试使用 B 类的 foo
  • 处于编辑模式时滑动即可删除

    我有一个使用 uitableview 的 iPhone 应用程序 我希望始终显示 重新排序 控件 并让用户滑动以删除行 我目前采取的方法是将表格视图置于编辑模式并允许在编辑模式下进行选择 self tableView editing YES
  • UICollectionView 滚动到任何页脚或页眉视图

    我想滚动到集合视图的页脚或标题视图 但是 标准方法是scrollToItemAtIndexPath仅滚动到单元格 void scrollToBottom NSInteger section self numberOfSectionsInCo
  • 循环缓冲区录音 iOS:可能吗?

    我的一个客户想要连续录制音频 当他单击 提交 时 他只想提交最后 10 秒的内容 所以他想要连续记录并且只保留最后 x 秒 我认为这需要类似循环缓冲区的东西 但是 作为 iOS 的新手 它看起来像AVAudioRecorder只能写入文件
  • 释放 Core Foundation 对象引用

    我是否需要释放 Core Foundation 对象来清理内存 如果是这样 怎么办 例如 在代码中 ABAddressBookRef addressBook ABAddressBookCreate CFArrayRef peopleArra
  • 如何在 NSMutableArray 中实现“按值分组”?

    我正在使用 NSMutableArray 我想像在 SQL 中那样按日期获取值group by log date logMuArray log currenttime 4 30pm log date 11 12 2011 log durat
  • iPhone 应用程序中的异步、同步、线程

    我正处于一个应用程序的设计阶段 该应用程序将利用 REST Web 服务 并且在使用异步 同步和线程方面遇到了困境 这是场景 假设您有三个选项可供深入研究 每个选项都有自己的基于 REST 的资源 我可以使用同步请求延迟加载每个请求 但这会
  • 如何阻止 UITableView moveRowAt IndexPath 在重新排序时留下空白行

    我遇到一个问题 在重新排序 UITableViewCells 时 tableView 不随单元格滚动 仅出现一个空白行 任何后续滚动都会出现数组越界错误 堆栈跟踪中没有我的任何代码 这是该问题的快速视频 http www screencas

随机推荐

  • git show --name-status letter:什么时候可以出现多个字母?

    关于 git 的快速问题 特别是 差异过滤器 http git scm com docs git diff字母 如使用时出现的那样 git show
  • 强制子类在重写方法上调用 super

    当扩展类时 有时我们会忘记在已经实现的方法中调用超类实现 当方法被重写而不调用 super 时 有什么方法可以通过抛出错误或其他内容来防止这种情况发生 Example class MainClass implements OnInit ng
  • 非规范化 ngrx 存储 - 设置选择器?

    我目前正在 ngrx 项目中处理一个有点复杂 深层 的结构 它可以被认为是父对象的数组 具有多个级别的子对象 它在服务器端标准化 扁平化 我的商店中的功能看起来像这样 rootObjs level1 byId lvl1 1 id lvl1
  • “任何一个或多个这些元素但必须至少有一个”的 XML 模式构造

    我正在尝试设置类似于 序列 的模式的一部分 其中所有子元素都是可选的 但至少有一个元素must存在 并且可能不止一个 我尝试执行以下操作 但 XMLSpy 抱怨 内容模型包含无法唯一确定的元素 和
  • 如何使用浮动而不翻转浮动项目并更改源顺序?这可能吗?

    看这个例子就明白了 http jsbin com ocewu http jsbin com ocewu 替代文本http easycaptures com fs uploaded 212 8042227539 png http easyca
  • Spring-MVC 3.1:如何映射带有尾部斜杠的 URL?

    我正在将旧版 servlet 应用程序转换为 Spring 3 1 在此过程中 一些 URL 现在已过时 我们的网络存在一些问题 短期内不会得到解决 我的老板不想相信他们的重定向将始终有效 因此 她要求我将自己的重定向放入网络应用程序中 一
  • 为现有数据库/sql 视图创建 django 模型?

    我已在 template dir sql someTableName sql 文件中插入视图的定义 创建或替换视图 所以每次我运行syncdb 创建数据库视图 我可以在 models py 中创建一个访问该视图的 python 类吗 使用
  • 如何进行不区分大小写的字符串比较?

    如何使下面的行不区分大小写 drUser Enrolled enrolledUsers FindIndex x gt x Username string drUser Username 1 今天早些时候我得到了一些建议 建议我使用 x Us
  • 将静态链接的 elf 二进制文件转换为动态链接的

    我有一个 elf 二进制文件 它已静态链接到 libc 我无权访问其 C 代码 我想使用 OpenOnload 库 它在用户空间中实现了套接字 因此与标准 libc 版本相比提供了更低的延迟 OpenOnload 实现标准套接字 api 并
  • CSS 网格行垂直溢出其容器

    我想在页面上有一个网格布局 其中网格延伸到整个视口 并且行具有最小高度 最简单的示例是具有单个单元格的网格 请参见下面的代码片段 我遇到的问题是 当视口的高度小于定义的最小行高时 该行垂直溢出其容器 通过在下面的示例中添加红色和绿色边框 可
  • iPhone 相机访问权限?

    我想知道如何访问 iPhone 相机并实时使用它 例如 仅在相机视图上绘图 另一个相关问题 可以显示吗同时 4 个摄像机视图就像 Mac 上的 Photo Booth 一样 您可以使用 AVFoundation 来做到这一点 void in
  • 从布伦特里汇款

    我使用 Braintree 作为我的网站的付款方式 收款时没问题 但现在我想将钱转入特定客户帐户 不退款 请帮我 谢谢你 Full disclosure I work at Braintree If you have any further
  • 如何让wildfly localhost连接自动变成https?

    我需要在本地主机上使用 https 协议测试我的 Web 应用程序 我怎样才能在wildfly上配置设置以使https localhost 8443 myapp html works New 我将其添加到我的安全领域
  • 使用 Google 地图对 geoJson 文件中的点进行自定义标记

    我使用 GeoJSON 作为 Google 地图的数据源 我使用 API v3 创建数据层 如下所示
  • Node.js 中的缓冲区是什么?

    正如您可以在有关 Buffer 类的 Node js 文档 http nodejs org api buffer html 一个缓冲区 类似于整数数组 但对应于 V8 堆外部的原始内存分配 到目前为止 一切都很好 现在让我困惑的是 从技术上
  • 查找其他列表项中列表项的列表索引

    我有一个长字符串列表 我想获取与另一个列表中的字符串子字符串匹配的列表元素的索引 使用列表理解可以轻松检查列表项是否包含列表中的单个字符串 例如这个问题 https stackoverflow com questions 4843158 c
  • AJAX 加载 WordPress 内容

    我一直在遵循 AJAX 教程来尝试将我的 WordPress 帖子内容加载到我网站的主页上 而无需重新加载页面 我不知道为什么 但是当单击链接时 它仍然导航到页面 而不是将内容加载到我指定的 div 中 不管怎样 这对我来说有点太多了 我希
  • [UIScreen mainScreen].bounds 与 [UIApplcation sharedApplication].keyWindow.bounds?

    我认为我想覆盖整个屏幕 我想将其框架设置为覆盖整个屏幕 浏览堆栈溢出 我发现设置视图框架覆盖屏幕的两种不同方法 UIScreen mainScreen bounds UIApplcation sharedApplication keyWin
  • 为什么 XDebug 忽略 NetBeans 6.8 中的断点?

    我在 Ubuntu 10 04 笔记本电脑上运行 PHP 5 3 2 Apache 2 2 14 和 xdebug 2 2 0rc1 并且尝试在 Netbeans 6 8 中的本地主机上设置调试 我的问题是我在 Netbeans 中设置的断
  • 尝试从 assetForURL:resultBlock 内部分配 __block ALAsset 时出错:

    我正在尝试创建一个方法 该方法将返回给定资产 url 的 ALAsset 我需要稍后上传资产 并希望在结果块之外执行此操作 ALAsset assetForPhoto Photo photo ALAssetsLibrary library