我在我的应用上实施缓存时,EXC_BAD_ACCESS
发现了可靠的崩溃。我用大约50行代码(Alamofire,HanekeSwift)在一个新项目中重新创建了这种情况,并且每次都会崩溃。
我正在做的就是在我的ViewController中,调用缓存get:
CachingManager.sharedInstance.fetchAllThings({
result in
// result should be an array of objects
print(result)
})
和CachingManager的fetchAllThings
方法是:
func fetchAllThings(completion: ([AnyObject] -> Void)?) {
let fetcher = CustomFetcher<JSON>(key: "HELLO")
fetcher.fetch(failure: {
error in
print(error)
}, success: {
json in
completion?(json.array)
})
}
现在,上面找到的CustomFetcher
实现如下:
override func fetch(failure fail: ((NSError?) -> ()), success succeed: (JSON) -> ()) {
let endpoint = "www.google.com"
Alamofire.request(.GET, endpoint, parameters: nil, encoding: .URL, headers: nil)
.responseJSON {
(data) -> Void in
self.onReceiveData(data.data!, failure: fail, success: succeed)
}
}
private func onReceiveData(data: NSData, failure: ((NSError?) -> ()), success: (JSON) -> ()) {
success(JSON.Array(["HI"])) <--- CRASH HAPPENS HERE
}
我尝试在EXC_BAD_ACCESS
中运行success
块时收到onReceiveData
。
我做错了吗?这是一个Swift问题吗?这是我使用的吊舱的问题吗?
作为参考,链接是一个带有上述代码的项目,如果这有助于任何人调试,那么每次启动都会崩溃。
答案 0 :(得分:0)
似乎在Haneke文档中使用自定义提取器并不是那么清楚。使用上面的fetchAllThings
方法,我试图直接从CustomFetcher
获取,这导致了错误的访问(这不是它的预期用途,我猜)。使用具有JSON
缓存的提取程序的正确方法是:
func fetchAllThings(completion: ([AnyObject] -> Void)?) {
let fetcher = CustomFetcher<JSON>(key: "HELLO")
let cache = Shared.JSONCache
cache.fetch(fetcher: fetcher, formatName: "original", failure: {
error in
print(error)
}, success: {
json in
completion?(json.array)
})
}
这里的关键是我现在正在使用库的cache
对象来调用Fetcher
。
我希望这有助于某人!