@@ -21,8 +21,12 @@ final class TrackerStore: NSObject {
21
21
22
22
private lazy var fetchedResultsController : NSFetchedResultsController < TrackerCoreData > = {
23
23
let fetchRequest = TrackerCoreData . fetchRequest ( )
24
- fetchRequest. sortDescriptors = [ NSSortDescriptor ( key: Constants . sortTrackersByCategoryKey, ascending: true ) ,
25
- NSSortDescriptor ( key: Constants . sortTrackersByNameKey, ascending: true ) ]
24
+ fetchRequest. sortDescriptors = [ NSSortDescriptor ( key: Constants . sortTrackersByCategoryKey,
25
+ ascending: true ,
26
+ selector: #selector( NSString . localizedStandardCompare ( _: ) ) ) ,
27
+ NSSortDescriptor ( key: Constants . sortTrackersByNameKey,
28
+ ascending: true ,
29
+ selector: #selector( NSString . localizedStandardCompare ( _: ) ) ) ]
26
30
fetchRequest. predicate = NSPredicate ( format: " %K CONTAINS[n] %@ " , #keyPath( TrackerCoreData . scheduleString) , " \( Date ( ) . startOfDay. weekDayString) " )
27
31
let controller = NSFetchedResultsController ( fetchRequest: fetchRequest,
28
32
managedObjectContext: context,
@@ -182,14 +186,20 @@ extension TrackerStore: TrackerStoreProtocol {
182
186
fetchedResultsController. sections ? [ section] . name
183
187
}
184
188
185
- func save( _ tracker: Tracker , in category: String ) throws {
189
+ func categoryStringForTracker( at indexPath: IndexPath ) -> String ? {
190
+ let trackerCoreData = fetchedResultsController. object ( at: indexPath)
191
+ return trackerCoreData. initialCategory
192
+ }
193
+
194
+ func save( _ tracker: Tracker , in category: String , isPinned: Bool ) throws {
186
195
let trackerCoreData = retrieveTrackerCoreDataEntity ( for: tracker)
187
- let categoryCoreData = retrieveCategoryCoreDataEntity ( for: category)
196
+ let categoryCoreData = retrieveCategoryCoreDataEntity ( for: isPinned ? L10n . Trackers . pinnedTitle : category)
188
197
trackerCoreData. trackerID = tracker. id
189
198
trackerCoreData. name = tracker. name
190
199
trackerCoreData. colorHex = UIColorMarshalling . serialize ( color: tracker. color)
191
200
trackerCoreData. emoji = tracker. emoji
192
201
trackerCoreData. scheduleString = tracker. schedule. map ( { $0. rawValue } ) . joined ( separator: " , " )
202
+ trackerCoreData. initialCategory = category
193
203
trackerCoreData. category = categoryCoreData
194
204
try context. save ( )
195
205
}
@@ -221,4 +231,31 @@ extension TrackerStore: TrackerStoreProtocol {
221
231
return Set < TrackerRecord > ( )
222
232
}
223
233
}
234
+
235
+ func pinTracker( at indexPath: IndexPath ) throws {
236
+ let pinnedTrackerCoreData = fetchedResultsController. object ( at: indexPath)
237
+ let pinnedCategoryCoreData : TrackerCategoryCoreData
238
+ if let existingCategoryCoreData = retrieveCategoryCoreDataEntity ( for: L10n . Trackers. pinnedTitle) {
239
+ pinnedCategoryCoreData = existingCategoryCoreData
240
+ } else {
241
+ pinnedCategoryCoreData = TrackerCategoryCoreData ( context: context)
242
+ pinnedCategoryCoreData. title = L10n . Trackers. pinnedTitle
243
+ pinnedCategoryCoreData. isCategorySelect = false
244
+ }
245
+ pinnedTrackerCoreData. category = pinnedCategoryCoreData
246
+ try context. save ( )
247
+ }
248
+
249
+ func unpinTracker( at indexPath: IndexPath ) throws {
250
+ let unpinnedTrackerCoreData = fetchedResultsController. object ( at: indexPath)
251
+ guard let initialCategoryString = unpinnedTrackerCoreData. initialCategory else { return }
252
+ let initialCategoryCoreData = retrieveCategoryCoreDataEntity ( for: initialCategoryString)
253
+ unpinnedTrackerCoreData. category = initialCategoryCoreData
254
+ try context. save ( )
255
+ }
256
+
257
+ func checkTrackerIsPinned( at indexPath: IndexPath ) -> Bool {
258
+ let trackerCoreData = fetchedResultsController. object ( at: indexPath)
259
+ return trackerCoreData. category? . title == L10n . Trackers. pinnedTitle ? true : false
260
+ }
224
261
}
0 commit comments