CleanArchitectureRxSwift icon indicating copy to clipboard operation
CleanArchitectureRxSwift copied to clipboard

Coredata: how to call sync method for attribute<CDModalName>

Open iamitksharma opened this issue 6 years ago • 2 comments

For Model like CDMessage,

Why func sync not called when I try to save CDMessage data in core data.

CDConversation contained CDMessage, for reference I am sharing response below: { id : 23, message : { id : 123, text : "hello" } }

In CDModalName+ext.swift :

extension CDConversation {
public static var id: Attribute<String> { return Attribute("id")}

     public static var last_message: Attribute<CDMessage> { return Attribute("message")}  
}

extension Conversation: CoreDataRepresentable {

public typealias CoreDataType = CDConversation

func sync(in context: NSManagedObjectContext) -> Observable<CDConversation> {
    let syncSelf = context.rx.sync(entity: self, update: update)
    let syncLast_message = last_message!.sync(in: context).map(Optional.init)
    return Observable.zip(syncSelf, syncLast_message, resultSelector: CDConversation.synced)
}

public func update(entity: CDConversation) {
    entity.id = Int16(id)

} }

iamitksharma avatar Sep 11 '18 06:09 iamitksharma

I have the same issue, the func sync(in context: NSManagedObjectContext) in the Core Data class extensions never called. The default sync function in the protocol extension is always called.

hackolein avatar Mar 28 '19 08:03 hackolein

I solved the problem, you have to add the function to the protocol CoreDataRepresentable func sync(in context: NSManagedObjectContext) -> Observable<CoreDataType>

hackolein avatar Mar 28 '19 12:03 hackolein