【发布时间】:2014-11-22 12:40:51
【问题描述】:
我已经按照这个将您的 swift 应用程序连接到 Parse.com 教程:http://ios-blog.co.uk/tutorials/connect-your-swift-application-to-parse-com/ 并且效果很好。本教程仅向您展示如何在 Parse.com 服务上放置数据。所以我对如何检索数据进行了一些研究。
在第一个教程中,它说要像这样向 Parse 添加数据:
Parse.setApplicationId("your_application_key", clientKey: "your_client_key")
var object = PFObject(className: "testDataClass")
object.addObject("iOSBlog", forKey: "websiteUrl")
object.addObject("Five", forKey: "websiteRating")
object.save()
Parse 团队 (http://blog.parse.com/2014/06/06/building-apps-with-parse-and-swift/) 编写的第二个教程中说要这样写:
var gameScore = PFObject(className: "GameScore")
gameScore.setObject(1337, forKey: "score")
gameScore.setObject("Sean Plott", forKey: "playerName")
gameScore.saveInBackgroundWithBlock {
(success: Bool!, error: NSError!) -> Void in
if success {
NSLog("Object created with id: \(gameScore.objectId)")
} else {
NSLog("%@", error)
}
}
然后要检索它,请使用以下代码:
var query = PFQuery(className: "GameScore")
query.getObjectInBackgroundWithId(gameScore.objectId) {
(scoreAgain: PFObject!, error: NSError!) -> Void in
if !error {
NSLog("%@", scoreAgain.objectForKey("playerName") as NSString)
} else {
NSLog("%@", error)
}
}
但是,当我使用官方解析代码时,我收到以下错误:
fatal error: Can't unwrap Optional.None
(lldb)
所有这些事情几乎发生在 Xcode 的每个窗格中:
谁能告诉我哪里出了问题以及如何解决?我对 Xcode 和 Swift 比较陌生,所以我非常感谢外行术语的回答。
编辑这里是 appDelegate.swift 函数
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
// Connect to Parse using the keys provided
Parse.setApplicationId("xxx", clientKey: "xxx")
// Store Data to Parse
var gameScore = PFObject(className: "GameScore")
gameScore.setObject(1337, forKey: "score")
gameScore.setObject("Sean Plott", forKey: "playerName")
gameScore.saveInBackgroundWithBlock {
(success: Bool!, error: NSError!) -> Void in
if success {
NSLog("Object created with id: \(gameScore.objectId)")
} else {
NSLog("%@", error)
}
}
var query = PFQuery(className: "GameScore")
query.getObjectInBackgroundWithId(gameScore.objectId) {
(scoreAgain: PFObject!, error: NSError!) -> Void in
if !error {
NSLog("%@", scoreAgain.objectForKey("playerName") as NSString)
} else {
NSLog("%@", error)
}
}
// Override point for customization after application launch.
return true
}
非常感谢。
添加新代码供用户查看:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
// Connect to Parse using the keys provided
Parse.setApplicationId("xxxx", clientKey: "xxxx")
// Store Data to Parse
var gameScore = PFObject(className: "GameScore")
gameScore.setObject(1337, forKey: "score")
gameScore.setObject("Sean Plott", forKey: "playerName")
gameScore.saveInBackgroundWithBlock {
(success: Bool!, error: NSError!) -> Void in
if (success ?? false) {
NSLog("Object created with id: \(gameScore.objectId)")
} else {
NSLog("%@", error)
}
}
var query = PFQuery(className: "GameScore")
query.getObjectInBackgroundWithId(gameScore.objectId) {
(scoreAgain: PFObject!, error: NSError!) -> Void in
if error == nil {
NSLog("%@", scoreAgain.objectForKey("playerName") as NSString)
} else {
NSLog("%@", error)
}
}
// Override point for customization after application launch.
return true
}
【问题讨论】:
-
你的
NSLog输出是什么?您的对象是使用 ID 创建的,还是打印了错误?无论如何,这听起来可能是一个 Parse 错误。如果找不到对象,我会假设它使用提供的NSError实例执行回调。 -
我很惊讶这个编译。尝试将
if !error替换为if error != nil。 -
实际上,我刚刚注意到您的堆栈跟踪实际上确实调用了回调。
scoreAgain真的有价值吗?您可以在使用前尝试将其与nil进行比较吗?如果没有,我建议您将回调的方法签名更改为:(scoreAgain: PFObject?, error: NSError?) -> Void,以强制您的代码检查值。 -
抱歉,请尝试将
if !error替换为if error == nil。 -
@CraigOtis 更改了行以匹配此:(scoreAgain: PFObject?, error: NSError?) -> Void 然后我收到此错误:PFObject 没有名为“objectForKey”的数字 - 真的抱歉,我说我有点菜鸟,我不知道如何解决这个问题。 :(
标签: ios swift parse-platform