sergdort / CleanArchitectureRxSwift

Example of Clean Architecture of iOS app using RxSwift
MIT License
3.9k stars 496 forks source link

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

Open iamitksharma opened 6 years ago

iamitksharma commented 6 years ago

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)

} }

hackolein commented 5 years ago

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 commented 5 years ago

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