Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Core data 在Swift中插入具有一对一关系的NSManagedObject_Core Data_Swift - Fatal编程技术网

Core data 在Swift中插入具有一对一关系的NSManagedObject

Core data 在Swift中插入具有一对一关系的NSManagedObject,core-data,swift,Core Data,Swift,在Xcode 6b3上使用Swift时,我很难简单地插入一个具有一对一关系的NSManagedObject 我将失败的代码(在SwiftCoreDataRelationshipReproTests.swift的testSwiftToOne单元测试方法中)归结为: let momURL : NSURL = NSBundle.mainBundle().URLForResource("SwiftCoreDataRelationshipRepro", withExtension: "momd")

在Xcode 6b3上使用Swift时,我很难简单地插入一个具有一对一关系的NSManagedObject

我将失败的代码(在SwiftCoreDataRelationshipReproTests.swift的
testSwiftToOne
单元测试方法中)归结为:

let momURL : NSURL = NSBundle.mainBundle().URLForResource("SwiftCoreDataRelationshipRepro",
    withExtension: "momd")
let mom : NSManagedObjectModel = NSManagedObjectModel(contentsOfURL: momURL)
let psc : NSPersistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: mom);
let ps : NSPersistentStore = psc.addPersistentStoreWithType(
    NSInMemoryStoreType,
    configuration: nil,
    URL: nil,
    options: nil,
    error: nil)
let moc : NSManagedObjectContext = NSManagedObjectContext()
moc.persistentStoreCoordinator = psc

// This throws an NSInvalidArgumentException: "An NSManagedObject of class 'NSManagedObject' must have a valid NSEntityDescription."
NSManagedObject(
            entity: NSEntityDescription.entityForName("Pet", inManagedObjectContext: moc),
            insertIntoManagedObjectContext: moc)
这似乎应该行得通。没什么棘手的

使用Swift可以正确插入(并保存)我的非常相似的
实体,该实体具有对多关系(如通过
testswiffttomy
test)。更复杂的Objective-C版本也成功地使用了相同的数据模型(通过
testObjcToOneAndToMany
test)

以下是整个例外:

file:///%3Cunknown%3E: test failure: -[SwiftCoreDataRelationshipReproTests testSwiftToOne()] failed: failed: caught "NSInvalidArgumentException", "An NSManagedObject of class 'NSManagedObject' must have a valid NSEntityDescription."
(
    0   CoreFoundation                      0x00007fff8dd6525c __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x00007fff84ce5e75 objc_exception_throw + 43
    2   CoreData                            0x00007fff8765dd16 -[NSManagedObject initWithEntity:insertIntoManagedObjectContext:] + 550
    3   SwiftCoreDataRelationshipReproTests 0x0000000100394d4a _TTOFCSo15NSManagedObjectcfMS_FT6entityGSQCSo19NSEntityDescription_30insertIntoManagedObjectContextGSQCSo22NSManagedObjectContext__S_ + 42
    4   SwiftCoreDataRelationshipReproTests 0x00000001003946bd _TFCSo15NSManagedObjectCfMS_FT6entityGSQCSo19NSEntityDescription_30insertIntoManagedObjectContextGSQCSo22NSManagedObjectContext__S_ + 93
    5   SwiftCoreDataRelationshipReproTests 0x0000000100393450 _TFC35SwiftCoreDataRelationshipReproTests35SwiftCoreDataRelationshipReproTests14testSwiftToOnefS0_FT_T_ + 816
    6   SwiftCoreDataRelationshipReproTests 0x00000001003934c2 _TToFC35SwiftCoreDataRelationshipReproTests35SwiftCoreDataRelationshipReproTests14testSwiftToOnefS0_FT_T_ + 34
    7   CoreFoundation                      0x00007fff8dc50a5c __invoking___ + 140
    8   CoreFoundation                      0x00007fff8dc508c4 -[NSInvocation invoke] + 308
    9   XCTest                              0x00000001003b023a -[XCTestCase invokeTest] + 253
    10  XCTest                              0x00000001003b03ac -[XCTestCase performTest:] + 142
    11  XCTest                              0x00000001003b8ad0 -[XCTest run] + 257
    12  XCTest                              0x00000001003af68b -[XCTestSuite performTest:] + 379
    13  XCTest                              0x00000001003b8ad0 -[XCTest run] + 257
    14  XCTest                              0x00000001003af68b -[XCTestSuite performTest:] + 379
    15  XCTest                              0x00000001003b8ad0 -[XCTest run] + 257
    16  XCTest                              0x00000001003af68b -[XCTestSuite performTest:] + 379
    17  XCTest                              0x00000001003b8ad0 -[XCTest run] + 257
    18  XCTest                              0x00000001003acc8f __25-[XCTestDriver _runSuite]_block_invoke + 56
    19  XCTest                              0x00000001003b773d -[XCTestObservationCenter _observeTestExecutionForBlock:] + 162
    20  XCTest                              0x00000001003acbc8 -[XCTestDriver _runSuite] + 269
    21  XCTest                              0x00000001003ad34a -[XCTestDriver _checkForTestManager] + 551
    22  XCTest                              0x00000001003bb879 +[XCTestProbe runTests:] + 175
    23  Foundation                          0x00007fff8e0aacb7 __NSFireDelayedPerform + 333
    24  CoreFoundation                      0x00007fff8dccc494 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
    25  CoreFoundation                      0x00007fff8dccbfcf __CFRunLoopDoTimer + 1151
    26  CoreFoundation                      0x00007fff8dd3d5aa __CFRunLoopDoTimers + 298
    27  CoreFoundation                      0x00007fff8dc87755 __CFRunLoopRun + 1525
    28  CoreFoundation                      0x00007fff8dc86f25 CFRunLoopRunSpecific + 309
    29  HIToolbox                           0x00007fff8e566a0d RunCurrentEventLoopInMode + 226
    30  HIToolbox                           0x00007fff8e566685 ReceiveNextEventCommon + 173
    31  HIToolbox                           0x00007fff8e5665bc _BlockUntilNextEventMatchingListInModeWithFilter + 65
    32  AppKit                              0x00007fff8538e26e _DPSNextEvent + 1434
    33  AppKit                              0x00007fff8538d8bb -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 122
    34  AppKit                              0x00007fff853819bc -[NSApplication run] + 553
    35  AppKit                              0x00007fff8536c7a3 NSApplicationMain + 940
    36  SwiftCoreDataRelationshipRepro      0x000000010000ad55 top_level_code + 37
    37  SwiftCoreDataRelationshipRepro      0x000000010000ad8a main + 42
    38  libdyld.dylib                       0x00007fff861115fd start + 1
)

所以我无法解决这个问题,但我想我把它缩小到了框架或Swift中的一个bug。使用
entityForName
相当于直接从managedObjectModel中获取实体,因此我尝试这样做:

let entities = moc.persistentStoreCoordinator.managedObjectModel.entitiesByName;
let keys = Array(entities.keys)
let petVar : String = keys[1] as String
let isEqual1 = (petVar == "Pet") // true
let isEqual2 = (petVar.hashValue == "Pet".hashValue) // true

let result1 = entities["Pet"] // nil
let result2 = entities[petVar] // non-nil
let result3 = entities.bridgeToObjectiveC().objectForKey("Pet".bridgeToObjectiveC()) // nil
let result4 = entities.bridgeToObjectiveC().objectForKey(petVar.bridgeToObjectiveC()) // non-nil

// Doesn't Pass
XCTAssertNotNil(NSEntityDescription.entityForName("Pet", inManagedObjectContext: moc));

// Passes
XCTAssertNotNil(NSEntityDescription.entityForName(petVar, inManagedObjectContext: moc));
它使用从字典中拉出的键,但不使用与该键等效的字符串(即使哈希值相同)

我认为这非常明确地表明,无论是在框架中还是在Swift本身中,都存在一个bug。我正在运行Xcode(6b3)和10.9.4


我想是时候做一个bug报告了。

多亏了,我把它缩小到了
NSEntityDescription.entityForName(“Pet”,在managedobjectcontext:moc中)
返回
nil
。我已经更新了GitHub项目,以更好地说明我的失败。另外:我在10.9.3上。值得一提的是,我在Xcode 6.0b3下看到了与OS X 10.9.4完全相同的东西。托尼:谢谢你在你的系统上重现了这一点。有助于排除这只是我的系统上的奇怪之处。戴夫·德隆无法在他的10.10系统上重新处理这个问题。我刚刚试过,可以用同一版本的Xcode(6b3)在运行10.10 Preview 3(14A283o)的MacBook Air上确认所有测试都通过了。谢谢,很好的侦察!你能告诉我什么是
键吗?和/或如果您感到雄心勃勃,请将您过去的工作放到GitHub请求中?:)当然很抱歉,我忘记包含中间键变量。是的,我将提交一个pull请求,其中包含传递的fixBug。在XCode 6.0(6A313)中,这个bug现在似乎已经修复了。