Skip to content

Commit c289238

Browse files
Roman KyrylenkoRoman Kyrylenko
Roman Kyrylenko
authored and
Roman Kyrylenko
committed
complete few todos;
1 parent c495f64 commit c289238

File tree

3 files changed

+18
-82
lines changed

3 files changed

+18
-82
lines changed

Source/Core/DBClient.swift

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,14 @@ public protocol DBClient {
4646
*/
4747
func observable<T: Stored>(for request: FetchRequest<T>) -> RequestObservable<T>
4848

49-
// TODO: remove
50-
func fetch<T: Stored>(id: String) -> Task<[T]>
51-
func fetch<T: Stored>(with predicate: NSPredicate?) -> Task<[T]>
52-
5349
/**
5450
Saves objects to database.
5551

5652
- Parameter objects: list of objects to be saved
5753

5854
- Returns: `Task` with saved objects or appropriate error in case of failure.
5955
*/
60-
func save<T: Stored>(_ objects: [T]) -> Task<[T]>
56+
@discardableResult func save<T: Stored>(_ objects: [T]) -> Task<[T]>
6157

6258
/**
6359
Updates changed performed with objects to database.
@@ -66,7 +62,7 @@ public protocol DBClient {
6662

6763
- Returns: `Task` with updated objects or appropriate error in case of failure.
6864
*/
69-
func update<T: Stored>(_ objects: [T]) -> Task<[T]>
65+
@discardableResult func update<T: Stored>(_ objects: [T]) -> Task<[T]>
7066

7167
/**
7268
Deletes objects from database.
@@ -75,7 +71,7 @@ public protocol DBClient {
7571

7672
- Returns: `Task` with deleted objects or appropriate error in case of failure.
7773
*/
78-
func delete<T: Stored>(_ objects: [T]) -> Task<[T]>
74+
@discardableResult func delete<T: Stored>(_ objects: [T]) -> Task<[T]>
7975

8076
}
8177

@@ -91,13 +87,19 @@ public extension DBClient {
9187

9288
- Returns: `Task` with found object or nil.
9389
*/
94-
func findFirst<T: Stored>(_ type: T.Type, primaryValue: String) -> Task<T?> {
90+
func findFirst<T: Stored>(_ type: T.Type, primaryValue: String, predicate: NSPredicate? = nil) -> Task<T?> {
9591
guard let primaryKey = type.primaryKey else {
9692
return Task(nil)
9793
}
9894

99-
let predicate = NSPredicate(format: "\(primaryKey) == %@", primaryValue)
100-
let request = FetchRequest<T>(predicate: predicate, fetchLimit: 1)
95+
let primaryKeyPredicate = NSPredicate(format: "\(primaryKey) == %@", primaryValue)
96+
var fetchPredicate: NSPredicate
97+
if let predicate = predicate {
98+
fetchPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [primaryKeyPredicate, predicate])
99+
} else {
100+
fetchPredicate = primaryKeyPredicate
101+
}
102+
let request = FetchRequest<T>(predicate: fetchPredicate, fetchLimit: 1)
101103

102104
return execute(request).continueWithTask { task -> Task<T?> in
103105
if let first = task.result?.first {
@@ -114,7 +116,7 @@ public extension DBClient {
114116

115117
- Returns: `Task` with deleted object or appropriate error in case of failure.
116118
*/
117-
func delete<T: Stored>(_ object: T) -> Task<T> {
119+
@discardableResult func delete<T: Stored>(_ object: T) -> Task<T> {
118120
return convertArrayTaskToSingleObject(delete([object]))
119121
}
120122

@@ -125,7 +127,7 @@ public extension DBClient {
125127

126128
- Returns: `Task` with updated object or appropriate error in case of failure.
127129
*/
128-
func update<T: Stored>(_ object: T) -> Task<T> {
130+
@discardableResult func update<T: Stored>(_ object: T) -> Task<T> {
129131
return convertArrayTaskToSingleObject(update([object]))
130132
}
131133

@@ -136,7 +138,7 @@ public extension DBClient {
136138

137139
- Returns: `Task` with saved object or appropriate error in case of failure.
138140
*/
139-
func save<T: Stored>(_ object: T) -> Task<T> {
141+
@discardableResult func save<T: Stored>(_ object: T) -> Task<T> {
140142
return convertArrayTaskToSingleObject(save([object]))
141143
}
142144

Source/CoreData/CoreDataDBClient.swift

Lines changed: 3 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,7 @@ extension CoreDataDBClient: DBClient {
135135
let result = try context.fetch(fetchRequest) as! [NSManagedObject]
136136
let resultModels = result.map { coreDataModelType.from($0) as! T }
137137
taskCompletionSource.set(result: resultModels)
138-
} catch {
139-
// TODO - generate proper error
140-
let error = NSError()
138+
} catch let error {
141139
taskCompletionSource.set(error: error)
142140
}
143141
}
@@ -149,11 +147,6 @@ extension CoreDataDBClient: DBClient {
149147
return CoreDataObservable(request: request, context: managedObjectContext)
150148
}
151149

152-
public func fetch<T: Stored>(id: String) -> Task<[T]> {
153-
let predicate = NSPredicate(format: "id = %@", id)
154-
return fetch(with: predicate)
155-
}
156-
157150
public func save<T: Stored>(_ objects: [T]) -> Task<[T]> {
158151
// For each element in collection:
159152
// 1. Cast T object to CoreDataModelConvertible if it is possible
@@ -170,9 +163,7 @@ extension CoreDataDBClient: DBClient {
170163
do {
171164
try context.save()
172165
taskCompletionSource.set(result: objects)
173-
} catch {
174-
// TODO - generate proper error
175-
let error = NSError()
166+
} catch let error {
176167
taskCompletionSource.set(error: error)
177168
}
178169
}
@@ -207,40 +198,7 @@ extension CoreDataDBClient: DBClient {
207198
do {
208199
try context.save()
209200
taskCompletionSource.set(result: objects)
210-
} catch {
211-
// TODO - generate proper error
212-
let error = NSError()
213-
taskCompletionSource.set(error: error)
214-
}
215-
}
216-
return taskCompletionSource.task
217-
}
218-
219-
public func fetch<T: Stored>(with predicate: NSPredicate? = nil) -> Task<[T]> {
220-
// 1. Make sure passed T type conforms to CoreDataModelConvertible protocol to fetch from CoreData DB
221-
// 2. Convert type to CoreDataModelConvertible type
222-
// 3. Create required NSFetchRequest with passed predicate
223-
// 4. Fetch items of CoreDataModelConvertible type
224-
// 5. Convert fetched items back to T type
225-
226-
// warning: Use preconditions
227-
228-
guard let coreDataModelType = T.self as? CoreDataModelConvertible.Type else {
229-
fatalError("CoreDataDBClient can manage only types which conform to CoreDataModelConvertible")
230-
}
231-
232-
let taskCompletionSource = TaskCompletionSource<[T]>()
233-
234-
performBackgroundTask { context in
235-
let fetchRequest = self.fetchRequest(for: coreDataModelType)
236-
fetchRequest.predicate = predicate
237-
do {
238-
let result = try context.fetch(fetchRequest) as! [NSManagedObject]
239-
let resultModels = result.map { coreDataModelType.from($0) as! T }
240-
taskCompletionSource.set(result: resultModels)
241-
} catch {
242-
// TODO - generate proper error
243-
let error = NSError()
201+
} catch let error {
244202
taskCompletionSource.set(error: error)
245203
}
246204
}

Source/Realm/RealmDBClient.swift

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -52,30 +52,6 @@ public class RealmDBClient {
5252

5353
extension RealmDBClient: DBClient {
5454

55-
public func fetch<T: Stored>(id: String) -> Task<[T]> {
56-
guard let realmModelType = T.self as? RealmModelConvertible.Type else {
57-
fatalError("CoreDataDBClient can manage only types which conform to CoreDataModelConvertible")
58-
}
59-
let result = realm.objects(realmModelType.realmClass())
60-
let objects = Array(result.map { realmModelType.from($0) as! T})
61-
62-
return Task(objects)
63-
}
64-
65-
public func fetch<T: Stored>(with predicate: NSPredicate?) -> Task<[T]> {
66-
guard let realmModelType = T.self as? RealmModelConvertible.Type else {
67-
fatalError("CoreDataDBClient can manage only types which conform to CoreDataModelConvertible")
68-
}
69-
70-
var result = realm.objects(realmModelType.realmClass())
71-
if let predicate = predicate {
72-
result = result.filter(predicate)
73-
}
74-
let objects = Array(result.map { realmModelType.from($0) as! T})
75-
76-
return Task(objects)
77-
}
78-
7955
public func save<T: Stored>(_ objects: [T]) -> Task<[T]> {
8056
let taskCompletionSource = TaskCompletionSource<[T]>()
8157

0 commit comments

Comments
 (0)