class RemoteNotificationsMarkReadOrUnreadOperation: RemoteNotificationsProjectOperation { private let shouldMarkRead: Bool private let identifierGroups: Set required init(project: WikimediaProject, apiController: RemoteNotificationsAPIController, modelController: RemoteNotificationsModelController, identifierGroups: Set, shouldMarkRead: Bool) { self.shouldMarkRead = shouldMarkRead self.identifierGroups = identifierGroups super.init(project: project, apiController: apiController, modelController: modelController) } required init(project: WikimediaProject, apiController: RemoteNotificationsAPIController, modelController: RemoteNotificationsModelController) { fatalError("init(project:apiController:modelController:) has not been implemented") } required init(apiController: RemoteNotificationsAPIController, modelController: RemoteNotificationsModelController) { fatalError("init(apiController:modelController:) has not been implemented") } override func execute() { // optimistically mark in database first for UI to reflect, then in API. let backgroundContext = modelController.newBackgroundContext() modelController.markAsReadOrUnread(moc: backgroundContext, identifierGroups: identifierGroups, shouldMarkRead: shouldMarkRead) { [weak self] result in guard let self = self else { return } switch result { case .success: self.apiController.markAsReadOrUnread(project: self.project, identifierGroups: self.identifierGroups, shouldMarkRead: self.shouldMarkRead) { error in if let error = error { self.finish(with: error) return } self.finish() } case .failure(let error): self.finish(with: error) } } } }