我想知道每当我尝试检索某个PFObject时可能导致崩溃的原因。
我创建了一个PFObject子类STKStake,并将该对象从我的iOS项目中保存到服务器。然而
然而,当我尝试获取对象时,我收到如下错误:
2014-11-14 15:58:38.947 StakesMockup [429:49445]启动STKStake的查询 2014-11-14 15:58:39.143 StakesMockup [429:49445] *由于未捕获的异常终止应用程序' NSInternalInconsistencyException',原因:' Key" intrinsicID"没有数据。在获取其值之前调用fetchIfNeeded。' * 第一次抛出调用堆栈: (0x18753de48 0x197c7c0e4 0x18753dd88 0x1001be698 0x1001c1720 0x10015e02c 0x10015e3b4 0x18742bfcc 0x1001f1818 0x1001f1a94 0x1001f1d10 0x1001b94d4 0x1001b85a8 0x1001b86c0 0x1001cf9f0 0x1002152bc 0x100214d14 0x1008d4e30 0x1008d4df0 0x1008e19a0 0x1008e2f18 0x19849d2e4 0x19849cfa8) libc ++ abi.dylib:以NSException类型的未捕获异常终止
当我在崩溃时检查callstack时,似乎我的代码调用[PFQuery findObjects:]
,调用[BFTask(Private) waitForResult:]
,调用objc_exception_throw
。
无论我是尝试使用PFQuery.findObjects
检索对象还是指定确切的ID,我都会遇到此问题。无论我是否已经注册了我的自定义子类STKStake
,或者我是否根本没有注册该类,我只是尝试将数据作为普通的PFObject
返回,我得到了它。尽管已经确认数据浏览器中确实填充了intrinsicID
密钥,但我得到了这次崩溃。
但是,如果我在OS X上创建一个小样本独立脚本,除了尝试将对象作为PFObject
之外什么都没做,我不得到此异常。该独立脚本的代码如下
import ParseOSX
Parse.setApplicationId("<appid>", clientKey: "<key>")
let q = PFQuery(className:"STKStake")
println("launching a stake query")
let results = q.findObjects()
println("results=\(results)")
但我做从项目中几乎相同的代码中获取异常:
func refreshFromServer(block:(success:Bool, error:NSError!)->Void)
{
NSLog("ENTRY: refreshFromServer")
dispatch_async_to_global { () -> Void in
let query = PFQuery(className: "STKStake")
NSLog("launching query for STKStake")
let results1 = query.findObjects()
NSLog("this line never executes")
NSLog("results1=%@",results1)
}
}
永远不会到达永不执行的行,因为在此之前抛出异常。
FWIW,我的自定义解析子类如下:
class STKSTake:PFObject, PFSubclassing, NSCopying, Trackable {
class func parseClassName() -> String? { return "STKSTake" }
override class func load() -> Void {
superclass()?.load()
self.registerSubclass()
}
@NSManaged var intrinsicID:NSString
// etc. etc.
}
但是我怀疑我的STKStake
类是罪魁祸首,因为正如我所提到的,即使没有注册类,我也会得到错误。此外,我已经能够保存子类的对象没有问题。
所以我不确定我的iOS项目中的调用上下文会导致查询代码如此惊人地崩溃,这在OSX上没有问题。
答案 0 :(得分:0)
我还没有在Swift上测试子类化(我现在更常见的是后端人)。我想知道NSManaged是否导致初始化程序在NSObject从“无数据”转换为“有数据”状态之前尝试设置一个值,该状态控制属性访问是否抛出。