@@ -294,24 +294,18 @@ fileprivate extension CoreDataEncoder {
294
294
// override for CoreData supported native types that also are Encodable
295
295
// and don't use encodable implementation
296
296
297
- func encodeGeneric( ) throws {
298
-
299
- // set coding key context
300
- codingPath. append ( key)
301
- defer { codingPath. removeLast ( ) }
302
-
303
- // get value
304
- try value. encode ( to: encoder)
305
- }
306
-
307
297
// identifier or to-one relationship
308
298
if let identifier = value as? CoreDataIdentifier {
309
299
300
+ let encodable = encoder. encodable
301
+
302
+ let identifierKey = type ( of: encodable) . identifierKey
303
+
310
304
// identifier
311
- if key. stringValue == type ( of : encoder . encodable ) . identifierKey {
305
+ if key. stringValue == identifierKey {
312
306
313
- // just write attribute value
314
- try encodeGeneric ( )
307
+ // skip value since we assume managed object is already faulted
308
+ assert ( container . value ( forKey : identifierKey ) != nil , " No identifier set " )
315
309
316
310
} else {
317
311
@@ -363,7 +357,12 @@ fileprivate extension CoreDataEncoder {
363
357
364
358
} else {
365
359
366
- try encodeGeneric ( )
360
+ // set coding key context
361
+ codingPath. append ( key)
362
+ defer { codingPath. removeLast ( ) }
363
+
364
+ // get value
365
+ try value. encode ( to: encoder)
367
366
}
368
367
}
369
368
@@ -409,28 +408,26 @@ fileprivate extension CoreDataEncoder {
409
408
codingPath. append ( key)
410
409
defer { codingPath. removeLast ( ) }
411
410
412
- let encoder = self . encoder
413
-
414
411
let managedObjects = try encodables. map { ( try $0. findOrCreate ( in: encoder. managedObjectContext) , $0) }
415
412
416
413
try managedObjects. forEach {
417
414
418
415
// create encoder for managed object
419
- let encoder = Encoder ( managedObjectContext: encoder. managedObjectContext,
416
+ let encoder = Encoder ( managedObjectContext: self . encoder. managedObjectContext,
420
417
managedObject: $0,
421
418
encodable: $1,
422
- codingPath: encoder. codingPath,
423
- userInfo: encoder. userInfo,
424
- log: encoder. log)
419
+ codingPath: self . encoder. codingPath,
420
+ userInfo: self . encoder. userInfo,
421
+ log: self . encoder. log)
425
422
426
423
// encoder into container
427
424
try $1. encode ( to: encoder)
428
425
}
429
426
430
- let set = NSSet ( array: managedObjects)
427
+ let set = NSSet ( array: managedObjects. map ( { $0 . 0 } ) )
431
428
432
429
// set value
433
- try encoder. set ( set, forKey: key)
430
+ try self . encoder. set ( set, forKey: key)
434
431
}
435
432
436
433
private mutating func setRelationship( _ identifier: CoreDataIdentifier , forKey key: Key ) throws {
@@ -455,18 +452,18 @@ fileprivate extension CoreDataEncoder {
455
452
let managedObject = try encodable. findOrCreate ( in: self . encoder. managedObjectContext)
456
453
457
454
// create encoder for managed object
458
- let encoder = Encoder ( managedObjectContext: self . encoder. managedObjectContext,
455
+ let newEncoder = Encoder ( managedObjectContext: self . encoder. managedObjectContext,
459
456
managedObject: managedObject,
460
457
encodable: encodable,
461
458
codingPath: self . encoder. codingPath,
462
459
userInfo: self . encoder. userInfo,
463
460
log: self . encoder. log)
464
461
465
462
// encoder into container
466
- try encodable. encode ( to: encoder )
463
+ try encodable. encode ( to: newEncoder )
467
464
468
465
// set value
469
- try encoder. set ( managedObject, forKey: key)
466
+ try self . encoder. set ( managedObject, forKey: key)
470
467
}
471
468
}
472
469
}
0 commit comments