Skip to content

Instantly share code, notes, and snippets.

@adiki
Created November 8, 2018 08:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save adiki/aa47b7fe8e10188bb8215a80a0fb75ec to your computer and use it in GitHub Desktop.
Save adiki/aa47b7fe8e10188bb8215a80a0fb75ec to your computer and use it in GitHub Desktop.
let gifsProvider: AnyObjectsProvider<GIF> = objectsManager.makeGIFsProvider()
protocol ObjectsManager {
var defaultGIFPredicate: NSPredicate { get }
func makeGIFsProvider() -> AnyObjectsProvider<GIF>
func save(gifs: [GIF]) -> Completable
func hide(gif: GIF)
static func makeObjectsManager(logger: Logger, completion: @escaping (ObjectsManager) -> Void)
}
protocol ObjectsProvider {
associatedtype Object
var updates: Observable<[Update]> { get }
func numberOfObjects() -> Int
func object(at indexPath: IndexPath) -> Object
func set(predicate: NSPredicate)
}
class AnyObjectsProvider<T>: ObjectsProvider {
let updates: Observable<[Update]>
init<OP: ObjectsProvider>(objectsProvider: OP) where OP.Object == T {
updates = objectsProvider.updates
_numberOfObjects = objectsProvider.numberOfObjects
_object = objectsProvider.object
_set = objectsProvider.set
}
...
}
class CoreDataObjectsProvider<CoreDataObject: Convertible>: NSObject, ObjectsProvider, NSFetchedResultsControllerDelegate where CoreDataObject: NSFetchRequestResult {
let updates: Observable<[Update]>
private let updatesBehaviorRelay = BehaviorRelay<[Update]>(value: [])
private let fetchedResultsController: NSFetchedResultsController<CoreDataObject>
private var updatesList: [Update] = []
init(fetchedResultsController: NSFetchedResultsController<CoreDataObject>) {
self.fetchedResultsController = fetchedResultsController
try! fetchedResultsController.performFetch()
updates = updatesBehaviorRelay.asObservable()
super.init()
fetchedResultsController.delegate = self
}
...
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment