gpt4 book ai didi

nsurlsession - 在 Alamofire 中使用 backgroundCompletionHandler 的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-04 03:58:27 24 4
gpt4 key购买 nike

我不清楚如何正确使用它,但见过其他人在做这种事情:

func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void) {
manager.sharedInstance.backgroundCompletionHandler = completionHandler
}

在我们类似的实现中,此时 completionHandlerpartial apply forwarder for reabstraction thunk helper...
在哪里 manager本质上是(尽管是单例):
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.ourcompany.app")
let manager = Alamofire.Manager(configuration: configuration)

但是,这会导致在控制台中打印以下警告:
Warning: Application delegate received call to -application:handleEventsForBackgroundURLSession:completionHandler: but the completion handler was never called.
我设置了一个断点 here此时该消息已在控制台中可见, backgroundCompletionHandlernil .

我们正在使用 Xcode 7.0 构建 iOS 9 SDK,目前使用 Alamofire 2.0.2

我最初认为这是在我们合并 Swift 2.0 分支时引入的,但我也看到了使用 Xcode 6.4 针对 iOS 8 SDK 进行早期提交的消息。

更新 1

解决@cnoon 的建议:
  • 标识符匹配 - 配置和管理器设置在单例中,因此不可能出错。
  • didSet 内部添加和打印时在 backgroundCompletionHandlerManager类,消息被记录之前 警告。
  • 在闭包内部打印时设置为 sessionDidFinishEventsForBackgroundURLSessiondelegate里面Manager类,消息打印之后 警告。
  • 覆盖 sessionDidFinishEventsForBackgroundURLSession 时并在调用 backgroundCompletionHandler 之前在其中打印, 消息被打印 之后 警告。
  • 至于验证我是否为后台 session 正确设置了我的 Xcode 项目,我不确定如何执行此操作,也找不到任何有关如何执行此操作的文档。

  • 我应该注意,在尝试从我的手机上传一些屏幕截图时,我最初无法重现此问题以尝试这些建议。

    只有在尝试分享一些照片后,我才能再次复制它。我不确定或相关性(如果有的话),但它可能与照片上传时间较长有关。

    更新 2
    UIBackgroundModes完全按照@Nick 的描述设置,并调用 completionHandler()直接在 application:handleEventsForBackgroundURLSession:completionHandler: 内部不显示警告。

    更新 3

    所以,看来我忽略了一个小而重要的细节。 Alamofire.Manager 周围有一个包装器这不会直接暴露它。其实现的相关部分如下所示:
    private var manager: Manager

    public var backgroundCompletionHandler: (() -> Void)? {
    get {
    return manager.backgroundCompletionHandler
    }
    set {
    manager.backgroundCompletionHandler = backgroundCompletionHandler
    }
    }

    并在 AppDelegate 中设置完成处理程序执行该代码路径。
    func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void) {
    myManager.sharedInstance.backgroundCompletionHandler = completionHandler
    }

    我已确认以下更改以公开 Alamofire.Manager 的实例并直接访问它不会产生警告:
    public var manager: Manager

    // public var backgroundCompletionHandler: (() -> Void)? {
    // get {
    // return manager.backgroundCompletionHandler
    // }
    // set {
    // manager.backgroundCompletionHandler = backgroundCompletionHandler
    // }
    // }

    AppDelegate :
    func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void) {
    myManager.sharedInstance.manager.backgroundCompletionHandler = completionHandler
    }

    基于此,似乎使用计算属性来代理完成处理程序是问题的原因。

    我真的不想公开这个属性,并且很想知道任何解决方法或替代方案。

    最佳答案

    看起来你所做的一切都是正确的。我有一个示例应用程序,它完全按照您所描述的方式工作,并且不会引发您看到的警告。我猜你在某个地方仍然有一些小错误。这里有一些想法可以尝试:

  • 验证标识符是否与您的后台 session 标识符匹配
  • 添加 didSet backgroundSessionHandler 上的日志声明在 Manager类临时验证它正在设置
  • 将日志语句添加到 sessionDidFinishEventsForBackgroundURLSession验证它是否按预期被调用
  • 覆盖 sessionDidFinishEventsForBackgroundURLSession在委托(delegate)上并手动调用 backgroundSessionHandler
  • 验证您已为后台 session 正确设置了 Xcode 项目


  • 更新 2

    您的计算属性是错误的。相反,它需要设置 backgroundCompletionHandlernewValue .否则,您永远不会正确地将其设置为新值。看到这个 thread了解更多信息。

    关于nsurlsession - 在 Alamofire 中使用 backgroundCompletionHandler 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32766683/

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