【发布时间】:2016-09-28 14:31:16
【问题描述】:
您好,我在 Swift 中解析一些 JSON 时出错,我的错误是:
'Invalid conversion from throwing function of type '(_, _, _) throws -> Void' to non-throwing function type '(NSData?, NSURLResponse?, NSError?) -> Void'
我认为这与在某处捕获错误有关,但我无法弄清楚这会发生在哪里,有人可以帮我吗?这是我的源代码:
import UIKit
import CoreData
class MasterViewController: UITableViewController {
var detailViewController: DetailViewController? = nil
override func viewDidLoad() {
super.viewDidLoad()
var appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
var context: NSManagedObjectContext = appDel.managedObjectContext
let url = NSURL(string: "https://www.googleapis.com/blogger/v3/blogs/10861780/posts?key=AIzaSyBwmI4AzMnBmr7oSVeL0EHdzMjXV1aATnQ")
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
if error != nil {
print(error)
} else {
//print(NSString(data: data!, encoding: NSUTF8StringEncoding))
do {
let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(rawValue: 0)) as! NSDictionary
if jsonResult.count > 0 {
if let items = jsonResult["items"] as? NSArray {
for items in items {
print(items)
if let title = items["title"] as? String {
if let content = items["content"] as? String {
var newPost: NSManagedObject = NSEntityDescription.insertNewObjectForEntityForName("Posts", inManagedObjectContext: context)
newPost.setValue(title, forKey: "title")
newPost.setValue(content, forKey: "content")
do {
try context.save()
}
}
}
}
}
}
} catch let error as NSError {
print(error)
}
var request = NSFetchRequest(entityName: "Posts")
request.returnsObjectsAsFaults = false
var results = try context.executeFetchRequest(request)
self.tableView.reloadData()
}
})
task.resume()
}
谢谢!
【问题讨论】:
-
如果你成功了会发生什么
try? NSJSONSerialization.JSONObjectWithData(...) -
没什么,我收到错误的那一行是:let task = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
-
哦,可能是因为你
tryingcatch块中的东西,不会被处理。你能试试(哈哈)try? context.executeFetchRequest(request)吗? -
啊哈,嗯,已经超越了我的错误,我不再收到任何其他错误,谢谢!
-
问题是
dataTaskWithURL不允许抛出,但那条线可能会抛出。将?添加到try会将可能引发的错误变为 nil 值。