Skip to content

Commit 22ee815

Browse files
authored
Use optimized storage records query (#553)
* Update Firebase from 6.11.0 to 6.12.0 * Use optimized query
1 parent 88b46ae commit 22ee815

File tree

7 files changed

+186
-83
lines changed

7 files changed

+186
-83
lines changed

Podfile

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ def all_pods
3030
pod 'SnapKit', '4.2.0'
3131

3232
# Firebase
33-
pod 'Firebase/Core', '6.11.0'
34-
pod 'Firebase/Messaging' , '6.11.0'
35-
pod 'Firebase/Analytics' , '6.11.0'
36-
pod 'Firebase/RemoteConfig', '6.11.0'
33+
pod 'Firebase/Core', '6.12.0'
34+
pod 'Firebase/Messaging' , '6.12.0'
35+
pod 'Firebase/Analytics' , '6.12.0'
36+
pod 'Firebase/RemoteConfig', '6.12.0'
3737

3838
pod 'YandexMobileMetrica/Dynamic', '3.8.2'
3939
pod 'Amplitude-iOS', '4.8.2'

Podfile.lock

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -36,34 +36,34 @@ PODS:
3636
- FBSDKLoginKit/Login (= 5.8.0)
3737
- FBSDKLoginKit/Login (5.8.0):
3838
- FBSDKCoreKit (~> 5.0)
39-
- Firebase/Analytics (6.11.0):
39+
- Firebase/Analytics (6.12.0):
4040
- Firebase/Core
41-
- Firebase/Core (6.11.0):
41+
- Firebase/Core (6.12.0):
4242
- Firebase/CoreOnly
43-
- FirebaseAnalytics (= 6.1.3)
44-
- Firebase/CoreOnly (6.11.0):
45-
- FirebaseCore (= 6.3.2)
46-
- Firebase/Messaging (6.11.0):
43+
- FirebaseAnalytics (= 6.1.5)
44+
- Firebase/CoreOnly (6.12.0):
45+
- FirebaseCore (= 6.3.3)
46+
- Firebase/Messaging (6.12.0):
4747
- Firebase/CoreOnly
48-
- FirebaseMessaging (~> 4.1.7)
49-
- Firebase/RemoteConfig (6.11.0):
48+
- FirebaseMessaging (~> 4.1.8)
49+
- Firebase/RemoteConfig (6.12.0):
5050
- Firebase/CoreOnly
51-
- FirebaseRemoteConfig (~> 4.4.3)
51+
- FirebaseRemoteConfig (~> 4.4.4)
5252
- FirebaseABTesting (3.1.2):
5353
- FirebaseAnalyticsInterop (~> 1.3)
5454
- FirebaseCore (~> 6.1)
5555
- Protobuf (>= 3.9.2, ~> 3.9)
56-
- FirebaseAnalytics (6.1.3):
56+
- FirebaseAnalytics (6.1.5):
5757
- FirebaseCore (~> 6.3)
5858
- FirebaseInstanceID (~> 4.2)
59-
- GoogleAppMeasurement (= 6.1.3)
59+
- GoogleAppMeasurement (= 6.1.5)
6060
- GoogleUtilities/AppDelegateSwizzler (~> 6.0)
6161
- GoogleUtilities/MethodSwizzler (~> 6.0)
6262
- GoogleUtilities/Network (~> 6.0)
6363
- "GoogleUtilities/NSData+zlib (~> 6.0)"
64-
- nanopb (~> 0.3.901)
64+
- nanopb (= 0.3.9011)
6565
- FirebaseAnalyticsInterop (1.4.0)
66-
- FirebaseCore (6.3.2):
66+
- FirebaseCore (6.3.3):
6767
- FirebaseCoreDiagnostics (~> 1.0)
6868
- FirebaseCoreDiagnosticsInterop (~> 1.0)
6969
- GoogleUtilities/Environment (~> 6.2)
@@ -74,12 +74,12 @@ PODS:
7474
- GoogleUtilities/Environment (~> 6.2)
7575
- GoogleUtilities/Logger (~> 6.2)
7676
- nanopb (~> 0.3.901)
77-
- FirebaseCoreDiagnosticsInterop (1.0.0)
78-
- FirebaseInstanceID (4.2.6):
77+
- FirebaseCoreDiagnosticsInterop (1.1.0)
78+
- FirebaseInstanceID (4.2.7):
7979
- FirebaseCore (~> 6.0)
8080
- GoogleUtilities/Environment (~> 6.0)
8181
- GoogleUtilities/UserDefaults (~> 6.0)
82-
- FirebaseMessaging (4.1.7):
82+
- FirebaseMessaging (4.1.8):
8383
- FirebaseAnalyticsInterop (~> 1.3)
8484
- FirebaseCore (~> 6.2)
8585
- FirebaseInstanceID (~> 4.1)
@@ -88,20 +88,20 @@ PODS:
8888
- GoogleUtilities/Reachability (~> 6.2)
8989
- GoogleUtilities/UserDefaults (~> 6.2)
9090
- Protobuf (>= 3.9.2, ~> 3.9)
91-
- FirebaseRemoteConfig (4.4.3):
91+
- FirebaseRemoteConfig (4.4.4):
9292
- FirebaseABTesting (~> 3.1)
9393
- FirebaseAnalyticsInterop (~> 1.4)
9494
- FirebaseCore (~> 6.2)
9595
- FirebaseInstanceID (~> 4.2)
9696
- GoogleUtilities/Environment (~> 6.2)
9797
- "GoogleUtilities/NSData+zlib (~> 6.2)"
9898
- Protobuf (>= 3.9.2, ~> 3.9)
99-
- GoogleAppMeasurement (6.1.3):
99+
- GoogleAppMeasurement (6.1.5):
100100
- GoogleUtilities/AppDelegateSwizzler (~> 6.0)
101101
- GoogleUtilities/MethodSwizzler (~> 6.0)
102102
- GoogleUtilities/Network (~> 6.0)
103103
- "GoogleUtilities/NSData+zlib (~> 6.0)"
104-
- nanopb (~> 0.3.901)
104+
- nanopb (= 0.3.9011)
105105
- GoogleDataTransport (3.0.1)
106106
- GoogleDataTransportCCTSupport (1.2.1):
107107
- GoogleDataTransport (~> 3.0)
@@ -206,10 +206,10 @@ DEPENDENCIES:
206206
- Fabric (= 1.10.2)
207207
- FBSDKCoreKit (= 5.8.0)
208208
- FBSDKLoginKit (= 5.8.0)
209-
- Firebase/Analytics (= 6.11.0)
210-
- Firebase/Core (= 6.11.0)
211-
- Firebase/Messaging (= 6.11.0)
212-
- Firebase/RemoteConfig (= 6.11.0)
209+
- Firebase/Analytics (= 6.12.0)
210+
- Firebase/Core (= 6.12.0)
211+
- Firebase/Messaging (= 6.12.0)
212+
- Firebase/RemoteConfig (= 6.12.0)
213213
- Highlightr (= 2.1.0)
214214
- IQKeyboardManagerSwift (= 6.5.1)
215215
- Kanna (= 4.0.3)
@@ -344,17 +344,17 @@ SPEC CHECKSUMS:
344344
Fabric: 706c8b8098fff96c33c0db69cbf81f9c551d0d74
345345
FBSDKCoreKit: e7dcac0aabcfb09d0166998edd95fe3b05a0ce5d
346346
FBSDKLoginKit: 1b0cf04df0370b37404213157b060d6666ede814
347-
Firebase: bc9cfc7a96c73268656d5aaab453ff1b4b530e0e
347+
Firebase: da031bc7012374e3bed17a6731b89327b29863b9
348348
FirebaseABTesting: 0d10f3cdc3fa00f3f175b5b56c1003c8e888299f
349-
FirebaseAnalytics: 0e3ecff2c5d86070f7d4325e21f1edabfbd558dc
349+
FirebaseAnalytics: 4e53a7eb7b76bc703c4d9239bc964545e9b23361
350350
FirebaseAnalyticsInterop: d48b6ab67bcf016a05e55b71fc39c61c0cb6b7f3
351-
FirebaseCore: beeff42c07c30ea94702471d99db2089b594fbbd
351+
FirebaseCore: bcd6c112429249d7921e907d661e8955a3549e26
352352
FirebaseCoreDiagnostics: af29e43048607588c050889d19204f4d7b758c9f
353-
FirebaseCoreDiagnosticsInterop: 6829da2b8d1fc795ff1bd99df751d3788035d2cb
354-
FirebaseInstanceID: d0eafcd8bdbd3447cd694594734078c3e3e77d8b
355-
FirebaseMessaging: 5ab57080c83bc98c9961412e1dab379f4193d02a
356-
FirebaseRemoteConfig: 51df936d5dfba17f267b2344070c89e8daa3fcfb
357-
GoogleAppMeasurement: 434cc7be25e71dc04b8d0e3079125127b330e84a
353+
FirebaseCoreDiagnosticsInterop: e9b1b023157e3a2fc6418b5cb601e79b9af7b3a0
354+
FirebaseInstanceID: ebd2ea79ee38db0cb5f5167b17a0d387e1cc7b6e
355+
FirebaseMessaging: de30f83a372a390be6f2ba44ec43a45b7ccdb43f
356+
FirebaseRemoteConfig: 8bb483b372bf859635c719d01911d5f7bf6df4b4
357+
GoogleAppMeasurement: 037f46d1d8ae8b312720f1042585ab961a1289e3
358358
GoogleDataTransport: 166f9b9f82cbf60a204e8fe2daa9db3e3ec1fb15
359359
GoogleDataTransportCCTSupport: f6ab1962e9dc05ab1fb938b795e5b310209edeec
360360
GoogleUtilities: f895fde57977df4e0233edda0dbeac490e3703b6
@@ -393,6 +393,6 @@ SPEC CHECKSUMS:
393393
VK-ios-sdk: 62a10b6571fbcda0657f455fedce7fedf55b4cd0
394394
YandexMobileMetrica: edb00e8af2903290e142ba4c488adf8d394e828a
395395

396-
PODFILE CHECKSUM: ede111563a6cda17513ca106f3d61a24cf9c947e
396+
PODFILE CHECKSUM: c7f4d3777f8545e792e37899c8d35d3e8bea532d
397397

398398
COCOAPODS: 1.8.4

Stepic/PersonalDeadlinesService.swift

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ protocol PersonalDeadlinesServiceProtocol: class {
1313
func canAddDeadlines(in course: Course) -> Bool
1414
func countDeadlines(for course: Course, mode: DeadlineMode) -> Promise<Void>
1515
func syncDeadline(for course: Course, userID: Int) -> Promise<Void>
16+
func syncDeadlines(for courses: [Course], userID: User.IdType) -> Promise<Void>
1617
func changeDeadline(for course: Course, newDeadlines: [SectionDeadline]) -> Promise<Void>
1718
func deleteDeadline(for course: Course) -> Promise<Void>
1819
func hasDeadlines(in course: Course) -> Bool
@@ -61,9 +62,37 @@ final class PersonalDeadlinesService: PersonalDeadlinesServiceProtocol {
6162
}
6263
}
6364

65+
func syncDeadlines(for courses: [Course], userID: User.IdType) -> Promise<Void> {
66+
return Promise { seal in
67+
self.storageRecordsAPI.retrieve(userID: userID, kindPrefixType: .deadline).done { storageRecords, _ in
68+
if storageRecords.isEmpty {
69+
courses.forEach { course in
70+
self.localStorageManager.deleteRecord(for: course)
71+
self.notificationsService.updatePersonalDeadlineNotifications(for: course)
72+
}
73+
seal.fulfill(())
74+
} else {
75+
storageRecords.forEach { storageRecord in
76+
if case .deadline(let courseID)? = storageRecord.kind,
77+
let course = courses.first(where: { $0.id == courseID }) {
78+
self.localStorageManager.set(storageRecord: storageRecord, for: course)
79+
self.notificationsService.updatePersonalDeadlineNotifications(for: course)
80+
}
81+
}
82+
seal.fulfill(())
83+
}
84+
}.catch { error in
85+
seal.reject(error)
86+
}
87+
}
88+
}
89+
6490
func syncDeadline(for course: Course, userID: Int) -> Promise<Void> {
6591
return Promise { seal in
66-
storageRecordsAPI.retrieve(kind: StorageKind.deadline(courseID: course.id), user: userID).done { storageRecords, _ in
92+
self.storageRecordsAPI.retrieve(
93+
userID: userID,
94+
kind: .deadline(courseID: course.id)
95+
).done { storageRecords, _ in
6796
guard let storageRecord = storageRecords.first else {
6897
self.localStorageManager.deleteRecord(for: course)
6998
self.notificationsService.updatePersonalDeadlineNotifications(for: course)
@@ -73,8 +102,7 @@ final class PersonalDeadlinesService: PersonalDeadlinesServiceProtocol {
73102
self.localStorageManager.set(storageRecord: storageRecord, for: course)
74103
self.notificationsService.updatePersonalDeadlineNotifications(for: course)
75104
seal.fulfill(())
76-
}.catch {
77-
error in
105+
}.catch { error in
78106
seal.reject(error)
79107
}
80108
}

Stepic/Sources/Modules/CourseList/CourseListInteractor.swift

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,7 @@ final class CourseListInteractor: CourseListInteractorProtocol {
7878

7979
// Fetch personal deadlines
8080
if let userID = self.userAccountService.currentUser?.id, self.isOnline {
81-
courses.forEach { course in
82-
self.personalDeadlinesService.syncDeadline(
83-
for: course,
84-
userID: userID
85-
).cauterize()
86-
}
81+
self.personalDeadlinesService.syncDeadlines(for: courses, userID: userID).cauterize()
8782
}
8883

8984
if self.currentCourses.isEmpty {

Stepic/StorageData.swift

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,33 @@ protocol StorageData {
1717
struct SectionDeadline {
1818
var section: Int
1919
var deadlineDate: Date
20+
2021
init(section: Int, deadlineDate: Date) {
2122
self.section = section
2223
self.deadlineDate = deadlineDate
2324
}
2425

2526
init?(json: JSON) {
26-
guard let section = json["section"].int, let deadlineDate = Parser.shared.dateFromTimedateJSON(json["deadline"]) else {
27+
guard let section = json[JSONKey.section.rawValue].int,
28+
let deadlineDate = Parser.shared.dateFromTimedateJSON(json[JSONKey.deadline.rawValue]) else {
2729
return nil
2830
}
31+
2932
self.section = section
3033
self.deadlineDate = deadlineDate
3134
}
3235

3336
var dictValue: [String: Any] {
3437
return [
35-
"section": section,
36-
"deadline": Parser.shared.timedateStringFromDate(date: deadlineDate)
38+
JSONKey.section.rawValue: self.section,
39+
JSONKey.deadline.rawValue: Parser.shared.timedateStringFromDate(date: self.deadlineDate)
3740
]
3841
}
42+
43+
enum JSONKey: String {
44+
case section
45+
case deadline
46+
}
3947
}
4048

4149
final class DeadlineStorageData: StorageData {
@@ -48,19 +56,24 @@ final class DeadlineStorageData: StorageData {
4856
}
4957

5058
required init(json: JSON) {
51-
courseID = json["course"].intValue
52-
deadlines = []
53-
for deadlineJSON in json["deadlines"].arrayValue {
59+
self.courseID = json[JSONKey.course.rawValue].intValue
60+
self.deadlines = []
61+
for deadlineJSON in json[JSONKey.deadlines.rawValue].arrayValue {
5462
if let deadline = SectionDeadline(json: deadlineJSON) {
55-
deadlines += [deadline]
63+
self.deadlines += [deadline]
5664
}
5765
}
5866
}
5967

6068
var dictValue: [String: Any] {
6169
return [
62-
"course": courseID,
63-
"deadlines": deadlines.map { $0.dictValue }
70+
JSONKey.course.rawValue: self.courseID,
71+
JSONKey.deadlines.rawValue: self.deadlines.map { $0.dictValue }
6472
]
6573
}
74+
75+
enum JSONKey: String {
76+
case course
77+
case deadlines
78+
}
6679
}

0 commit comments

Comments
 (0)