2

我们的应用程序每次都能在我们测试过的所有 iOS 设备上顺利运行(从 xcode/adhoc 生产/调试中全新安装或更新,我们已经全部尝试过)。但它在应用程序审查中被拒绝,因为它似乎按需资源永远不会变得可用,即使资源的下载完成而没有错误。

我们正在访问相机回调的阻塞区域中的资源。如果资源可用,我们继续使用它,否则我们只在下载完成后执行 beginAccessingResourcesWithCompletionHandler() 和免费回调块。问题是应用程序审阅者说它下载(有一个进度条),然后一遍又一遍地要求重新下载。为什么刚下载成功就不可用(注意没有错误)?

[request conditionallyBeginAccessingResourcesWithCompletionHandler:^(BOOL resourcesAvailable) {
if (resourcesAvailable)
{
    /* use the resource. */
    /* unblock the callback. done. */
}
else
{
    /* ask to download resource */
    [request beginAccessingResourcesWithCompletionHandler:^(NSError * _Nullable error) {
        if (error)
        {
            NSLog(@"%@", error);
            /* don't unblocked. return. will hang. */ 
        }
        /* unblock the callback. done. resource should be available next camera frame. */
    }];
} }];

这也不是存储不足的问题。我们已经涵盖并测试了这一点。此外, beginAccessingResourcesWithCompletionHandler() 返回没有错误。

4

2 回答 2

0

提交 9 次后,这个问题为我们解决了。但不幸的是,尚不清楚哪个更改对于解决它至关重要。此外,它也在 13.2.3 更新附近。总的来说,我会确保这些(注意有很多关于 SO 的投票示例不遵循这些): 1)所有 beginAccess 调用都在主线程上完成。2) 不要在conditionallyBeginAcces 和beginAccess 之间重用resourceRequest。(正如马特所指出的)。每次从标签名称重新定义它们。3) 确保resourceRequest 的定义使得它们在整个过程完成之前不会超出范围。审阅者设备可能有一个后台守护程序,该守护程序会立即删除已释放的资源(由于超出范围)。4) 如果在 dispatch_sync() 块内访问 odr,请确保有'

于 2019-10-19T18:33:58.783 回答
0

我猜这个问题是没有注意到文档中大写的警告:

一个 NSBundleResourceRequest 对象只能用于一个成功的资源请求。

您不能重用捆绑资源请求对象。它只有两个工作:下载资源(一次),以及将它们保存在适当的位置(通过持久化)。一旦你成功下载了一次资源,你只能用这个捆绑资源请求对象做两件事(你可以同时做这两件事):

  • 打电话endAccessingResources

  • 扔掉对象(或者让它超出范围或随着应用程序的终止而死)。

如果您想在应用程序的同一次运行中再次查明您是否还有这些资源,则需要从新的捆绑资源请求重新开始。

不过,我会走得更远。正如我在评论中所说,您似乎在滥用conditionallyBegin. 无需在应用程序的同一次运行期间询问两次您是否已经拥有这些资源,也无需致电conditionallyBegin找出,因为当您说beginAccessing正确的事情时:要么您将开始使用这些资源(如果它们存在)或者您将下载它们并开始使用它们(如果它们不存在)。永远使用的唯一原因conditionallyBegin是,如果您的逻辑与事实证明某些资源不存在时的逻辑不同。

于 2019-10-14T17:59:24.370 回答