【问题标题】:Error parsing JSON in Swift2在 Swift2 中解析 JSON 时出错
【发布时间】: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
  • 哦,可能是因为你trying catch 块中的东西,不会被处理。你能试试(哈哈)try? context.executeFetchRequest(request)吗?
  • 啊哈,嗯,已经超越了我的错误,我不再收到任何其他错误,谢谢!
  • 问题是 dataTaskWithURL 不允许抛出,但那条线可能会抛出。将 ? 添加到 try 会将可能引发的错误变为 nil 值。

标签: json swift swift2


【解决方案1】:

您似乎没有使用 do-try-catch 方法处理所有的投掷功能。 根据https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html的Swift 3文档@

在您的情况下,您似乎忘记处理 var-results 引发的错误。此外,您还没有使用 do-try-catch 方法处理抛出函数 session.dataTaskWithURL。 如果您按以下方式修改代码,则不应出现此错误:

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()
do {

  let task = try 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 error1 as NSError { // this is for context.save
                                      print(error1)
                                   }

                        }

                    }
                }
            }
        }
    }
        var request = NSFetchRequest(entityName: "Posts")

        request.returnsObjectsAsFaults = false
        do{
           var results = try context.executeFetchRequest(request)
        } catch let error2 as NSError { // this is for context.executeFetchRequest
             print(error2)
          }
        self.tableView.reloadData()
    }
  })
  task.resume()
  } catch let error3 as NSError { // this is for session.dataTaskWithURL
      print(error3)
} 
}

希望这会有所帮助!干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多