【发布时间】:2018-07-03 16:43:42
【问题描述】:
我有一个代码,它从 twitter 获取 JSON 并将其放入名为 feedStruct 的结构中,但还将其解析到 UITableViewController。
我已经在模拟器中测试了多次,但也想在我的 iPhone 上测试它,然后它在这段代码中崩溃了。我在“使应用程序崩溃”这一行旁边发表了评论:
线程 8:致命错误:在展开可选值时意外发现 nil
(我认为它在某些时候说线程 6 也想过,如果这与它有关的话。)
代码如下:
import Foundation
protocol twitterModelProtocol: class {
func twitterDownloaded(items: [Any])
func feedTwitterDatesDownloaded(items: [feedStruct])
}
class twitterModel: NSObject {
//properties
weak var delegate: twitterModelProtocol!
let urlPath = "http://MYWEBPAGE/twit.php" //this will be changed to the path where service.php lives
func downloadTwitterItems() {
let url: URL = URL(string: urlPath)!
let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.default)
let task = defaultSession.dataTask(with: url) { (data, response, error) in
if error != nil {
print("Failed to download twitter data")
} else {
print("Twitter data downloaded")
self.parseTwitterJSON(data!)
}
}
task.resume()
}
func parseTwitterJSON(_ data:Data) {
var jsonResult = [Any]()
do{
jsonResult = try JSONSerialization.jsonObject(with: data, options:JSONSerialization.ReadingOptions.allowFragments) as! [Any]
} catch let error as NSError {
print(error)
}
var jsonElement = NSDictionary()
var feeds = [feedStruct]()
for i in 0 ..< jsonResult.count {
jsonElement = jsonResult[i] as! NSDictionary
let feed = feedStruct()
//the following insures none of the JsonElement values are nil through optional binding
if let unixstamp = jsonElement["created_at"] as? String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEE MMM d HH:mm:ss Z yyyy"
print(unixstamp)
let date = dateFormatter.date(from: unixstamp)! //THIS LINE IS MAKING THE APP CRASH ON iPHONE NOT SIMULATOR <<<<<<<<<<<<<<<<<<<<<
let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month, .day, .hour], from: date)
let finalDate = calendar.date(from:components)
let timestamp = finalDate?.timeIntervalSince1970
let finalTimestamp = String(format: "%.0f", timestamp!)
feed.date = finalTimestamp
feed.type = "twitter"
}
feeds.append(feed)
}
DispatchQueue.main.async(execute: { () -> Void in
self.delegate.twitterDownloaded(items: jsonResult)
self.delegate.feedTwitterDatesDownloaded(items: feeds)
})
}
}
【问题讨论】:
-
有些东西是 nil,找出哪个 var 是 nil。
-
为什么要让你的类继承自
NSObject?这不是 Objective-C,类不需要有基类。您也不应该使用NSDictionary,而是使用它的原生Swift 对应物Dictionary(更具体地说,在处理JSON 数据时使用Dictionary<String:Any>)。catch let error as NSError { print(error) }也是不必要的,你可以简单地做catch {print(error)},error变量由catch块自动提供。您还应该通过在调试器中设置异常断点来将错误定位到单行。 -
带有
unixstamp的设备上打印了什么? -
应该的日期 - 这更奇怪@MilanNosáľ
-
检查我的答案,如果没有帮助,复制粘贴打印结果
unixstamp
标签: ios json iphone swift twitter