frenzy-ios/Reader/ItemListType.swift

64 lines
1.9 KiB
Swift

//
// ItemListType.swift
// Reader
//
// Created by Shadowfacts on 3/13/22.
//
import Foundation
import CoreData
import Persistence
enum ItemListType: Hashable, Equatable {
case unread
case all
case group(Group)
case feed(Feed)
var title: String {
switch self {
case .unread:
return "Unread Articles"
case .all:
return "All Articles"
case let .group(group):
return group.title
case let .feed(feed):
return feed.title ?? feed.url?.host() ?? "Unknown Feed"
}
}
var idFetchRequest: NSFetchRequest<NSManagedObjectID> {
let req = NSFetchRequest<NSManagedObjectID>(entityName: "Item")
req.resultType = .managedObjectIDResultType
switch self {
case .unread:
req.predicate = NSPredicate(format: "read = NO")
case .all:
break
case .group(let group):
req.predicate = NSPredicate(format: "feed in %@", group.feeds!)
case .feed(let feed):
req.predicate = NSPredicate(format: "feed = %@", feed)
}
return req
}
var countFetchRequest: NSFetchRequest<Item>? {
let req = Item.fetchRequest()
switch self {
case .unread:
req.predicate = NSPredicate(format: "read = NO")
case .all:
return nil
case .group(let group):
// use the feed ids, because passing the NSSet of feeds into the predicate results in a multithreading violation if the request is used on a different context
let feedIDs = group.feeds!.map { ($0 as! Feed).objectID }
req.predicate = NSPredicate(format: "read = NO AND feed in %@", feedIDs)
case .feed(let feed):
req.predicate = NSPredicate(format: "read = NO AND feed = %@", feed)
}
return req
}
}