尝试从 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 时出错: 的相关文章

  • iOS App 中 AVAudioPlayer 和 MPMusicPlayerController 的独立音量控制。

    在我的应用程序中 我使用 AVAudioPlayer 播放下载的音频 同时使用 MPMusicPlayerController 播放用户 iPod 音乐库中的音频 我需要能够调整 AVAudioPlayer 实例的音量 使其声音更大 比来自
  • 动画 UIButton 上的用户交互

    我正在尝试在 Xcode 4 2 中制作一个针对 iPhone 的小应用程序 我想要的是一个UIButton使屏幕向下动画 当你按下它时 你将它的 alpha 设置为 0 我找到了一种方法UIView能够处理用户交互的类 并得出以下代码 U
  • UIView 动画取消任何触摸输入?

    我在这里有一个 UIScrollView 当用户滚动到页面时 我在屏幕中间添加显示标签 问题是 当动画进行时 用户无法滚动到下一页 所有用户交互似乎被禁用 直到动画结束 这是我用于显示标签的代码 if scrollView dragging
  • 如何将文件保存到 iPhone 上?

    我有一个问题 你们大多数人可能会觉得有点奇怪 我正在为 OS X 制作一个应用程序 但我需要它来将文本文件写入 iPhone 文件夹 我知道 iPhone 必须连接到电脑 而且我认为发送电子邮件不起作用 我认为这就像在连接时找到 iPhon
  • 将正在运行的计数显示计时器添加到 iOS 应用程序中,例如时钟秒表?

    我正在使用一个应用程序 该应用程序可以处理设备运动事件并以 5 秒的增量更新界面 我想向应用程序添加一个指示器 以显示应用程序运行的总时间 看起来像秒表的计数器 例如本机 iOS 时钟应用程序 是计算应用程序运行时间并将其显示给用户的合理方
  • 将 NSString 中的“”字符替换为“\”(以创建 Unix 路径)

    使用以下内容不起作用 NSString stringByReplacingOccurrencesOfString NSString target withString NSString replacement 我所说的 不起作用 是指不做任
  • 在 iOS8 中使用 UISearchBar 启用取消按钮

    有什么方法可以启用 UISearchBar 的 取消 按钮吗 现在 每当我致电辞职第一响应者时 取消按钮都会被禁用 仅当我再次点击搜索栏时 取消才会启用 有没有办法停止禁用取消按钮 这是适用于 iOS 8 和 Swift 的可行解决方案 f
  • iPhone 上的 Flash(或 Silverlight)

    我对在 iPhone 上开发应用程序感兴趣 并且作为一名 NET 和 ActionScript 开发人员 我对 Objective C Cocoa Touch 编程的学习曲线有点害怕 我知道 Adob e 已经为 iPhone 准备好了 F
  • UIDocumentsInteractionController 显示 iBooks 但不打开它

    我的 UIDocumentsInteractionController 正在工作 提供一个带有 iBooks 按钮的操作表 但是当我单击该按钮时 它只是关闭并且不会将我带到 iBooks 这是我的代码 NSString filenamePa
  • UITextView 放入 UITableViewCell 时有时不显示内容

    我想知道是否还有其他人面临同样的问题 我有一个 UITextView 字段放置在 UITableViewCell 中 有时它不显示文本 当我单击或滚动表格视图时 它就会出现 有什么猜测吗 Details 我调用一个方法viewDidLoad
  • 如果按下子视图的按钮如何取消 UIGestureRecognizer

    我正在努力从手势识别器中获得我想要的行为 特别是在其他手势已触发时取消某些手势 我有一个滚动视图设置为分页和每个页面中的多个子视图 我添加了一个触摸手势识别器 如果用户点击页面的右侧或左侧 则可以滚动到下一页或上一页 Add a gestu
  • MFMessageComposeViewController 显示空白/白屏

    if MFMessageComposeViewController canSendText MFMessageComposeViewController controller MFMessageComposeViewController a
  • 电子邮件在 ShareKit 中不起作用并且没有错误

    我正在使用 ShareKit 将 Facebook Twitter 和电子邮件共享添加到我的 iPhone 应用程序中 现在 Facebook 和 Twitter 可以使用 但电子邮件无法使用 最大的问题是没有错误或任何错误 它正常工作 但
  • 如何使用 iPhone 将照片上传到服务器?

    我正在编写一个 iPhone 应用程序 它可以拍摄照片然后将其上传到服务器 如何使用 Cocoa 将照片上传到服务器 我想我在某处使用 NSUrl Thanks Header interface EPUploader NSObject NS
  • UI键盘回避和自动布局

    鉴于 iOS 6 中对自动布局的关注以及 Apple 工程师的推荐 查看 WWDC 2012 视频 我们不再直接操作视图的框架 那么如何仅使用自动布局和 NSLayoutConstraint 来避免键盘呢 Update 这看起来是一个合理的
  • 为什么不使用 Interface Builder [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • NSFetchedResultsController 中的部分名称与托管对象值不匹配

    我正在使用 NSFetchedResultsController 用大约 1500 个实体的中等大小的核心数据存储的结果填充 UITableView 结果控制器相当标准 一些潜在错误的 热点 并不适合此设置 在与其使用的同一 主 线程上创建
  • 检索旋转的 UIImageView 的所有 4 个坐标

    如何获取 UIImageView 的 4 个坐标 我知道可以得到CGRect以及origin x和origin y 但是如何找到所有4个角呢 编辑 我正在旋转 UIImageViews 这就是我问的原因 P 您可以添加矩形的宽度和高度来获取
  • ios:如何使用 CGPath 模糊图像?

    我创建了一个 CGPath 区域 如绿色圆圈所示 CGPath区域需要清晰 图像的其余部分将应用模糊或半透明效果 我可以使用以下代码在CGPath内剪切图像 UIGraphicsBeginImageContext view frame si
  • 如何从 Xib 文件加载自定义 UITableViewCell?

    问题很简单 如何加载自定义UITableViewCell来自 Xib 文件 这样做可以让您使用 Interface Builder 来设计您的单元 由于内存管理问题 答案显然并不简单 这个线程 https stackoverflow com

随机推荐

  • 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