微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

翠鸟在SessionDelegate.remove上崩溃

如何解决翠鸟在SessionDelegate.remove上崩溃

我们正在使用Kingfisher为我们的iOS应用下载图像,并且在尝试取消下载任务时遇到了很多崩溃

EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000020

Crashed: com.apple.main-thread
0  CFNetwork                      0x18436b058 HTTPParser::HTTPParser(__CFAllocator const*,HTTPParserClient*,HTTPParser*) + 44
1  CFNetwork                      0x18424b27c HTTPMessage::commonInitialization(unsigned char,HTTPMessage const*) + 212
2  CFNetwork                      0x18424b27c HTTPMessage::commonInitialization(unsigned char,HTTPMessage const*) + 212
3  CFNetwork                      0x18424b41c HTTPMessage::HTTPMessage(HTTPMessage const*) + 112
4  CFNetwork                      0x18436c1dc HTTPRequestMessage::HTTPRequestMessage(HTTPRequestMessage const*) + 36
5  CFNetwork                      0x18422a74c HTTPRequest::HTTPRequest(HTTPRequest const*) + 24
6  CFNetwork                      0x18422ce8c URLRequest::initialize(URLRequest const*,unsigned char) + 656
7  CFNetwork                      0x1841e2bd8 _createRequestcopy(__CFAllocator const*,_CFURLRequest const*,unsigned char) + 152
8  CFNetwork                      0x184355de0 -[NSURLRequest mutablecopyWithZone:] + 44
9  libswiftFoundation.dylib       0x105a95a0c URLRequest.init(_bridged:) + 77948
10 libswiftFoundation.dylib       0x105a99344 static URLRequest._unconditionallyBridgeFromObjectiveC(_:) + 92596
11 Kingfisher                     0x102fb5788 SessionDelegate.remove(_:) + 93 (SessionDelegate.swift:93)
12 Kingfisher                     0x102fb566c closure #1 in SessionDelegate.add(_:url:callback:) + 1000 (<compiler-generated>:1000)
13 Kingfisher                     0x102fb9eb0 partial apply for thunk for @escaping @callee_guaranteed (@guaranteed SessionDelegate,@uNowned Int,@in_guaranteed SessionDataTask.TaskCallback) -> () + 84 (<compiler-generated>:84)
14 Kingfisher                     0x102f46734 specialized closure #1 in Delegate.delegate<A>(on:block:) + 96 (<compiler-generated>:96)
15 Kingfisher                     0x102fb9f34 partial apply for specialized closure #1 in Delegate.delegate<A>(on:block:) + 28 (<compiler-generated>:28)
16 Kingfisher                     0x102fb14d0 SessionDataTask.cancel(token:) + 356 (<compiler-generated>:356)
17 Kingfisher                     0x102f6de18 DownloadTask.cancel() + 74 (ImageDownloader.swift:74)
18 MyApp                          0x1011e55f4 UIImageView.cancel() + 4310799860 (<compiler-generated>:4310799860)
...
...

例如,当我们在表视图中重复使用单元格时,我们将调用方法,在该视图中,我们将取消不再可见的单元格的请求。我们在UIImageView上创建了一个扩展,以定义便捷方法,例如cancel()

  • 这次崩溃的原因可能是什么?我们代码中的下载任务是可选的,因此即使对象不再存在,调用image?.downloadTask.cancel()也不应该导致崩溃,甚至不应该触发这些方法

在某些情况下,服务器似乎取消了HTTP请求,但似乎不是唯一的时间。

以下是我们的操作的示例代码

func fetchImage(fromURL url: URL,completion: @escaping (UIImage?,NSError?) -> Void) -> MyAppDownloadTask {    
    
    let resource = ImageResource(downloadURL: url)
    let options: KingfisherOptionsInfo = [.targetCache(cache),.downloader(downloader)]

    let task = KingfisherManager.shared.retrieveImage(with: resource,options: options,progressBlock: nil) { result in

    switch result {
        case .success(let value):
            completion(value.image,nil)
        case .failure(let error):
            completion(nil,error.toNSError())
    }
    }

    return MyAppDownloadTask(task: task)
}

private class MyAppDownloadTask {

    let task: DownloadTask? // KingFisher task

    init(task: DownloadTask?) {
        self.task = task
    }

    func cancel() {
        task?.cancel()
    }
}

在我们的集合视图中重复使用单元格时,我们会调用cancel方法

override func prepareForReuse() {
    super.prepareForReuse()
    downloadTask.cancel()
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?