Skip to content

Commit 3650b65

Browse files
committed
Working on Encoder
1 parent ab2e1c1 commit 3650b65

File tree

1 file changed

+22
-25
lines changed

1 file changed

+22
-25
lines changed

Sources/Encoder.swift

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -294,24 +294,18 @@ fileprivate extension CoreDataEncoder {
294294
// override for CoreData supported native types that also are Encodable
295295
// and don't use encodable implementation
296296

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-
307297
// identifier or to-one relationship
308298
if let identifier = value as? CoreDataIdentifier {
309299

300+
let encodable = encoder.encodable
301+
302+
let identifierKey = type(of: encodable).identifierKey
303+
310304
// identifier
311-
if key.stringValue == type(of: encoder.encodable).identifierKey {
305+
if key.stringValue == identifierKey {
312306

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")
315309

316310
} else {
317311

@@ -363,7 +357,12 @@ fileprivate extension CoreDataEncoder {
363357

364358
} else {
365359

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)
367366
}
368367
}
369368

@@ -409,28 +408,26 @@ fileprivate extension CoreDataEncoder {
409408
codingPath.append(key)
410409
defer { codingPath.removeLast() }
411410

412-
let encoder = self.encoder
413-
414411
let managedObjects = try encodables.map { (try $0.findOrCreate(in: encoder.managedObjectContext), $0) }
415412

416413
try managedObjects.forEach {
417414

418415
// create encoder for managed object
419-
let encoder = Encoder(managedObjectContext: encoder.managedObjectContext,
416+
let encoder = Encoder(managedObjectContext: self.encoder.managedObjectContext,
420417
managedObject: $0,
421418
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)
425422

426423
// encoder into container
427424
try $1.encode(to: encoder)
428425
}
429426

430-
let set = NSSet(array: managedObjects)
427+
let set = NSSet(array: managedObjects.map({ $0.0 }))
431428

432429
// set value
433-
try encoder.set(set, forKey: key)
430+
try self.encoder.set(set, forKey: key)
434431
}
435432

436433
private mutating func setRelationship(_ identifier: CoreDataIdentifier, forKey key: Key) throws {
@@ -455,18 +452,18 @@ fileprivate extension CoreDataEncoder {
455452
let managedObject = try encodable.findOrCreate(in: self.encoder.managedObjectContext)
456453

457454
// create encoder for managed object
458-
let encoder = Encoder(managedObjectContext: self.encoder.managedObjectContext,
455+
let newEncoder = Encoder(managedObjectContext: self.encoder.managedObjectContext,
459456
managedObject: managedObject,
460457
encodable: encodable,
461458
codingPath: self.encoder.codingPath,
462459
userInfo: self.encoder.userInfo,
463460
log: self.encoder.log)
464461

465462
// encoder into container
466-
try encodable.encode(to: encoder)
463+
try encodable.encode(to: newEncoder)
467464

468465
// set value
469-
try encoder.set(managedObject, forKey: key)
466+
try self.encoder.set(managedObject, forKey: key)
470467
}
471468
}
472469
}

0 commit comments

Comments
 (0)