2016-02-27 41 views
1

在我的应用上实现缓存时,我发现可靠的崩溃EXC_BAD_ACCESS。我使用2个豆荚(Alamofire,HanekeSwift)在约50行代码中重新创建了一个新项目的情况,并且每次都崩溃。访问嵌套完成块时发生崩溃 - EXC_BAD_ACCESS

所有我做的是在我的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试图运行我的onReceiveData中的success块。

我做错了什么?这是一个Swift问题吗?这是我用的豆荚问题吗?

作为参考,linked是一个包含上面代码的项目,每次启动时都会崩溃,如果这有助于任何人进行调试。

Project on GitHub

回答

0

好像使用自定义提取程序是不是在哈尼克文档说清楚。使用上面的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

我希望这可以帮助别人!