应用程序中的EXC_BAD_ACCESS错误,Alamofire 3.1.2

时间:2015-11-07 23:26:50

标签: iphone swift alamofire

我正在运行Xcode 7.1,在9.1上使用iOS设备,以及最新版本的Alamofire,我相信它是3.1.2。

我见过其他有类似错误的人 - Thatthis one from SO - 我的,但这些决议对我不起作用。在这些情况下工作的分辨率似乎是删除DerivedData文件夹,但这在我的情况下不起作用。

问题是,当我在模拟器中运行时,我可以使用Alamofire发出Web请求,但是当我在设备上安装应用程序时,我得到以下错误(在图像中)。

this one from their Github issues page

我尝试过使用运行9.1,9.0.1和8.3的设备。当我尝试发出Web请求时,所有这些设备都崩溃了。我坚持这个,我没有取得进展。直到我在几天前更新了我的podfile和我的Xcode版本中的所有pod之后,这一直有效。

我是iOS开发的新手,所以如果你需要查看更多错误日志或那种性质的东西,请告诉我,我会尽我所能来帮助你。任何帮助表示赞赏。

编辑:根据请求添加Alamofire.request方法的代码。还为引用的Manager.sharedInstance.request方法添加代码。这些是Alamofire图书馆内的方法。

// Alamofire.request
public func request(
    method: Method,
    _ URLString: URLStringConvertible,
    parameters: [String: AnyObject]? = nil,
    encoding: ParameterEncoding = .URL,
    headers: [String: String]? = nil)
    -> Request
{
    return Manager.sharedInstance.request(
        method,
        URLString,
        parameters: parameters,
        encoding: encoding,
        headers: headers
    )
}

// Manager.sharedInstance.request
public func request(
    method: Method,
    _ URLString: URLStringConvertible,
    parameters: [String: AnyObject]? = nil,
    encoding: ParameterEncoding = .URL,
    headers: [String: String]? = nil)
    -> Request
{
    let mutableURLRequest = URLRequest(method, URLString, headers: headers)
    let encodedURLRequest = encoding.encode(mutableURLRequest, parameters: parameters).0
    return request(encodedURLRequest)
}

1 个答案:

答案 0 :(得分:0)

一个问题是stringByAddingPercentEncodingWithAllowedCharacters返回一个可选项,当你进行字符串插值时,你会在字符串中出现Optional(...)。因此,当它试图从中创建一个URL时,它无疑会失败。打印uri字符串,您就会看到问题所在。例如,如果searchTerm"foo bar",则uri将成为:

https://api.spotify.com/v1/search&q=Optional("foo%20bar")&type=artist,album,track

但这不正确。在表达式的末尾添加!以打开它:

let searchTermEncoded = searchTerm.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!

然后URI将(很大程度上)正确。

-

我建议不要自己逃避这个百分比(因为你正在使用的字符集不正确,即使你正确地解开searchTermEncoded)。让Alamofire为您做到这一点:

let urlString = "https://api.spotify.com/v1/search"
let parameters = ["q" : searchTerm, "type" : "artist,album,track"]

Alamofire.request(.GET, urlString, parameters: parameters)
    .responseJSON { response  in
        guard response.result.error == nil else {
            print(response.result.error)
            return
        }

        print(response.result.value)
}