翠鸟在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.JdbcOdbc...