Exception 带有dataTaskWithUrl的EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0)
我正在使用GooglePlacesAPI搜索附近的地方。然而,我只想要特定类型的地方。当我只指定一种类型时,代码(如下所示)工作,但当我添加第二种类型时,我的代码会运行,并立即给我一条EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0)错误:Exception 带有dataTaskWithUrl的EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0),exception,swift,google-places-api,Exception,Swift,Google Places Api,我正在使用GooglePlacesAPI搜索附近的地方。然而,我只想要特定类型的地方。当我只指定一种类型时,代码(如下所示)工作,但当我添加第二种类型时,我的代码会运行,并立即给我一条EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0)错误: session.dataTaskWithURL(url!,completionHandler:{(数据:NSData!,响应:nsurresponse!,错误:NSError!)->在中无效 我知道url是有效的。我可以将其插入浏览器
session.dataTaskWithURL(url!,completionHandler:{(数据:NSData!,响应:nsurresponse!,错误:NSError!)->在中无效
我知道url是有效的。我可以将其插入浏览器并查看json,所以我不明白问题出在哪里
func search(location : CLLocationCoordinate2D, radius : Int, callback : (items : [Attraction]?, errorDescription : String?) -> Void) {
var urlString = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=37.7873589,-122.408227&radius=4000&types=aquarium|art_gallery&key=YOURKEY"
var url = NSURL(string: urlString)
var session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
session.dataTaskWithURL(url!, completionHandler: { (data : NSData!, response : NSURLResponse!, error : NSError!) -> Void in
if error != nil {
callback(items: nil, errorDescription: error.localizedDescription)
}
if let statusCode = response as? NSHTTPURLResponse {
if statusCode.statusCode != 200 {
callback(items: nil, errorDescription: "Could not continue. HTTP Status Code was \(statusCode)")
}
}
NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
callback(items: GooglePlaces.parseFromData(data), errorDescription: nil)
})
}).resume()
}
class func parseFromData(data : NSData) -> [Attraction] {
var attractions = [Attraction]()
var json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
var results = json["results"] as? [NSDictionary]
for result in results! {
var placeId = result["place_id"] as String
var image = result["icon"] as String
var name = result["name"] as String
var ratingString = ""
var types = result["types"] as [String]
println(types)
if result["rating"] != nil {
var rating = result["rating"] as Double
ratingString = "\(rating)"
}
var coordinate : CLLocationCoordinate2D!
if let geometry = result["geometry"] as? NSDictionary {
if let location = geometry["location"] as? NSDictionary {
var lat = location["lat"] as CLLocationDegrees
var long = location["lng"] as CLLocationDegrees
coordinate = CLLocationCoordinate2D(latitude: lat, longitude: long)
var placemark = MKPlacemark(coordinate: coordinate, addressDictionary: nil)
var attraction = Attraction(id: placeId, imageUrl: "image url", locationName: name, ratingAvg: "\(ratingString)", types: types, placemarker: placemark)
attractions.append(attraction)
}
}
}
return attractions
}
我知道url是有效的
URL无效。您不知道您认为自己知道的内容。请收听运行时。它知道的比您知道的更多
只需单独尝试以下代码(例如,在操场上):
url
为零。这是您的问题。您不能强制展开nil
,否则会崩溃
一旦你意识到这一点,你就可以开始思考为什么URL是无效的。(很明显,为什么可能是无效的。)学会相信编译器和运行时是成功编程的关键
提示:像这样形成您的URL,一切正常:
let url2 = NSURL(scheme: "https", host: "maps.googleapis.com", path: "/maps/api/place/nearbysearch/json?location=37.7873589,-122.408227&radius=4000&types=aquarium|art_gallery&key=YOURKEY")
为什么会这样?看看文档,看看这个初始值设定项为您做了什么…我会使用
.stringByAddingPercentEscapesUsingEncoding()
返回:
http://example.com/?foo=bar%7Cbaz
是否检查了var url=NSURL(字符串:urlString)
是否返回nil
?你完全正确,但我不明白为什么会发生这种情况。当我将我的url插入浏览器时,它会向我显示它应该响应的json。你知道了!做得很好。你看,浏览器正在补偿这个错误,但NSURL不会-除非你使用的初始值设定项是%为y编码投票支持涓涓细流解释,而不是完全清楚explanation@BradThomas这是你的特权!我必须同意@BradThomas。我能理解让OP自己找到答案的愿望——这将帮助他更好地从更基本的层面把握问题。但最终,我觉得StackOverflow是用来回答问题,而不是给出答案的帮助提问者找到答案的提示。我也对不清楚的解释投了反对票。如果你想这样解释,请在博客和链接上写一篇教程。
let url2 = NSURL(scheme: "https", host: "maps.googleapis.com", path: "/maps/api/place/nearbysearch/json?location=37.7873589,-122.408227&radius=4000&types=aquarium|art_gallery&key=YOURKEY")
var urlString = "http://example.com/?foo=bar|baz"
if var escapedURLString = urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) {
NSURL(string: escapedURLString)
}