为啥我的按需资源仍处于正在下载...状态?

Posted

技术标签:

【中文标题】为啥我的按需资源仍处于正在下载...状态?【英文标题】:Why my On Demand Resource is still in Downloading... status?为什么我的按需资源仍处于正在下载...状态? 【发布时间】:2020-08-14 14:59:22 【问题描述】:

我很确定这就是为什么我的完成块没有在这里调用的原因:

    resourceRequest = NSBundleResourceRequest(tags: Set(["preview"]))
    resourceRequest?.beginAccessingResources  [weak self] downloaded in //not called


        // here I do what I need with this and at the end I call      
        // self?.resourceRequest?.endAccessingResources()
        
    

我已经清理并重新启动了 Xcode,也重新启动了 iPhone 和 Macbook。没有任何帮助。这里怎么清除?

编辑

我已经打印了一些进度属性的信息:

print(resourceRequest?.progress.isCancelled) //false
print(resourceRequest?.progress.isPaused) //false
print(resourceRequest?.progress.isFinished) //false
print(resourceRequest?.progress.isIndeterminate) //false
print(resourceRequest?.progress.localizedDescription) //0% completed
print(resourceRequest?.progress.isCancellable) //true

但是当我打电话给cancel() 时,什么都没有改变...

如何拒绝、取消或恢复该请求?

当我打印进度时,我有:

<NSProgress: 0x280cd1720> : Parent: 0x0 (portion: 0) / Fraction completed: 0.0000 / Completed: 0 of 1

【问题讨论】:

请尝试在 resourceRequest?.beginAccessingResources 之前设置 resourceRequest?.loadingPriority = NSBundleResourceRequestLoadingPriorityUrgent 不起作用...;(还是一样...;(这发生在一个特定的设备上...不是每个 @BartłomiejSemańczyk 你找到解决方案了吗?我们正在遭受同样的痛苦。很少发生,但是当它发生时……看在上帝的份上,我已经尝试了一切以退出该状态并请求资源(取消,有条件地和正常地请求访问,使用优先级)无济于事。只需重新安装应用程序,有时甚至还必须重新启动手机;真是莫名其妙。此外,这不仅仅是因为 Xcode,因为我们知道用户也在遭受这种痛苦。 @XtianD。你只需要等待。我的用户也遇到过这种情况,如果他们改天再试,它就可以了。我不知道如何解决它;( @XtianD。你想通了吗?你知道有什么可以帮助的吗?我现在又遇到这个问题了,不知道该怎么办... 【参考方案1】:

希望你检查一下这个注意

在访问任何标有请求管理的标签的资源之前,您必须调用此方法或有条件地BeginAccessingResources(completionHandler:)

func conditionallyBeginAccessingResources(completionHandler: @escaping (Bool) -> Void)

正如 Apple 建议在以下链接的一些复选标记之前做的那样

Please check this checkpoint

【讨论】:

但真的是这样吗?;) 我认为您是否遇到了特定于设备的问题,您需要重新启动该设备并重新安装构建您已经重新启动设备您是否清除了派生数据并卸载构建?【参考方案2】:

设备上的磁盘是否已满? The documentation 提供了一个方便的小 sn-p 来注册通知并检查它。

复制到这里:

清单 4-11 注册 NSBundleResourceRequestLowDiskSpaceNotification 通知


    // Register to call self.lowDiskSpace when the notification occurs
    [[NSNotificationCenter defaultCenter]
        addObserver:self
           selector:@selector(lowDiskSpace:)
               name:NSBundleResourceRequestLowDiskSpaceNotification
             object:nil
    ];

    // Notification handler for low disk space warning
    -(void)lowDiskSpace:(NSNotification*)theNotification
    
        // Free the lower priority resource requests
        for (NSBundleResourceRequest *atRequest in self.lowPriorityRequests) 
            // End accessing the resources
            [atRequest endAccessingResources];
        
     
        // clear lowPriorityRequests preventing multiple calls to endAccesingResource
        [self.lowPriorityRequests removeAllObjects];
    

【讨论】:

不,磁盘空间肯定没有满。有 256GB,超过 150 个是免费的。 好的,很酷。我会在下面跟进 Hardik Bar 的回答,并确保您按照 Apple 的意图使用 API。苹果文档状态:You must call this method or conditionallyBeginAccessingResources(completionHandler:) before accessing any resources marked with the tags managed by the request.

以上是关于为啥我的按需资源仍处于正在下载...状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何在开发期间托管来自 xcode 的按需资源

未从 testflight 下载的按需资源

无法找到嵌入在应用程序包中的按需资源 [关闭]

按需资源如何“离开捆绑包”并到达苹果服务器?

iOS 应用程序中的按需资源 AppStore 上传失败 - 不允许的路径

当我打开浏览器的网络选项卡时,msw mockServiceWorker.js 资源仍处于“待定”状态