Skip to content

Commit f04002d

Browse files
author
Roman Kyrylenko
committed
Merge branch 'feature/common_fixes' into 'master'
Feature/common fixes See merge request !1
2 parents c4cdc9b + d74471c commit f04002d

File tree

5 files changed

+39
-27
lines changed

5 files changed

+39
-27
lines changed

DBClient/Core/DBClient.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,13 @@ public protocol DBClient {
7676
}
7777

7878
public extension DBClient {
79+
80+
/// Fetch all entities from database
81+
///
82+
/// - Returns: Task with array of objects
83+
func fetchAll<T: Stored>() -> Task<[T]> {
84+
return execute(FetchRequest())
85+
}
7986

8087
/**
8188
Finds first element with given value as primary.

DBClient/CoreData/CoreDataDBClient.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public class CoreDataDBClient {
8686

8787
dict[NSUnderlyingErrorKey] = error as NSError
8888
let wrappedError = NSError(domain: "com.Yalantis.DBClient", code: 9999, userInfo: dict)
89-
NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
89+
print("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
9090
abort()
9191
}
9292

@@ -105,6 +105,7 @@ public class CoreDataDBClient {
105105
context.parent = managedObjectContext
106106
context.perform {
107107
closure(context)
108+
try? self.managedObjectContext.save()
108109
}
109110
}
110111

DBClient/CoreData/CoreDataObservable.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ class CoreDataObservable<T: Stored, U: NSManagedObject>: RequestObservable<T> {
3030
}
3131
if let sortDescriptor = request.sortDescriptor {
3232
fetchRequest.sortDescriptors = [sortDescriptor]
33+
} else {
34+
let defaultSortDescriptor = NSSortDescriptor(key: coreDataModelType.primaryKey, ascending: true)
35+
fetchRequest.sortDescriptors = [defaultSortDescriptor]
3336
}
3437
fetchRequest.fetchLimit = request.fetchLimit
3538
fetchRequest.fetchOffset = request.fetchOffset
@@ -63,7 +66,7 @@ class CoreDataObservable<T: Stored, U: NSManagedObject>: RequestObservable<T> {
6366
closure(.initial(mapped))
6467
observer = closure
6568

66-
fetchedResultsControllerDelegate.observer = { change in
69+
fetchedResultsControllerDelegate.observer = { [unowned self] change in
6770
if case .update(deletions: let deletions, insertions: let insertions, modifications: let modifications) = change {
6871
let mappedInsertions = insertions.map { ($0, coreDataModelType.from($1) as! T) }
6972
let mappedModifications = modifications.map { ($0, coreDataModelType.from($1) as! T) }
@@ -91,11 +94,11 @@ private class FetchedResultsControllerDelegate<T: NSManagedObject>: NSObject, NS
9194

9295
switch type {
9396
case .delete:
94-
batchChanges.append(.delete(indexPath![0], object))
97+
batchChanges.append(.delete(indexPath!.row, object))
9598
case .insert:
96-
batchChanges.append(.insert(newIndexPath![0], object))
99+
batchChanges.append(.insert(newIndexPath!.row, object))
97100
case .update:
98-
batchChanges.append(.update(indexPath![0], object))
101+
batchChanges.append(.update(indexPath!.row, object))
99102
default: break
100103
}
101104
}

DBClient/Realm/RealmDBClient.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,7 @@ extension RealmDBClient: DBClient {
117117
}
118118

119119
public func observable<T: Stored>(for request: FetchRequest<T>) -> RequestObservable<T>{
120-
// return RealmObservable(request: request, realm: realm)
121-
return RequestObservable(request: request)
120+
return RealmObservable(request: request, realm: realm)
122121
}
123122

124123
}
@@ -147,4 +146,5 @@ extension Results {
147146

148147
return l
149148
}
149+
150150
}

DBClient/Realm/RealmObservable.swift

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import RealmSwift
1111

1212
extension Object: Stored {}
1313

14-
public class RealmObservable<T: Object>: RequestObservable<T> {
14+
public class RealmObservable<T: Stored>: RequestObservable<T> {
1515

1616
internal let realm: Realm
1717
internal var notificationToken: NotificationToken?
@@ -24,37 +24,38 @@ public class RealmObservable<T: Object>: RequestObservable<T> {
2424
open override func observe(_ closure: @escaping (ObservableChange<T>) -> Void) {
2525
precondition(notificationToken == nil, "Observable can be observed only once")
2626

27-
var realmObjects = realm.objects(T.self)
27+
guard let realmModelType = T.self as? RealmModelConvertible.Type else {
28+
fatalError("RealmDBClient can manage only types which conform to RealmModelConvertible")
29+
}
30+
31+
var realmObjects = realm.objects(realmModelType.realmClass())
2832
if let predicate = request.predicate {
2933
realmObjects = realmObjects.filter(predicate)
3034
}
3135
if let sortDescriptor = request.sortDescriptor, let key = sortDescriptor.key {
3236
realmObjects = realmObjects.sorted(byProperty: key, ascending: sortDescriptor.ascending)
3337
}
3438

35-
notificationToken = realmObjects.addNotificationBlock { [unowned self] changes in
36-
closure(self.map(changes))
39+
notificationToken = realmObjects.addNotificationBlock { changes in
40+
switch changes {
41+
case .initial(let initial):
42+
let mapped = initial.map { realmModelType.from($0) as! T }
43+
closure(.initial(Array(mapped)))
44+
45+
case .update(let objects, let deletions, let insertions, let modifications):
46+
let mappedObjects = objects.map { realmModelType.from($0) as! T }
47+
let insertions = insertions.map { (index: $0, element: mappedObjects[$0]) }
48+
let modifications = modifications.map { (index: $0, element: mappedObjects[$0]) }
49+
closure(.update(deletions: deletions, insertions: insertions, modifications: modifications))
50+
51+
case .error(let error):
52+
closure(.error(error))
53+
}
3754
}
3855
}
3956

4057
public func stopObserving() {
4158
notificationToken = nil
4259
}
4360

44-
fileprivate func map(_ realmChange: RealmCollectionChange<Results<T>>) -> ObservableChange<T> {
45-
switch realmChange {
46-
case .initial(let initial):
47-
return .initial(Array(initial))
48-
49-
case .update(let objects, let deletions, let insertions, let modifications):
50-
let deletions = deletions.map { $0 }
51-
let insertions = insertions.map { (index: $0, element: objects[$0]) }
52-
let modifications = modifications.map { (index: $0, element: objects[$0]) }
53-
return .update(deletions: deletions, insertions: insertions, modifications: modifications)
54-
55-
case .error(let error):
56-
return .error(error)
57-
}
58-
}
59-
6061
}

0 commit comments

Comments
 (0)