0

我有实体,想通过批量请求一次删除 10 条记录。实体可能有任意数量的记录。我使用 fetchLimit = 10 和偏移量 0,10,20,30 创建了获取请求...当我尝试删除时,并非所有记录都被删除。它只是删除随机记录。但是日志显示成功删除了记录。我们如何解决这个问题。

public static func deleteEvents() {
    let coredataManager = CoreDataManager()
    let persistence = PersistenceManager(coredataManager: coredataManager)
    let eventCount = coredataManager.countOfObjects(Event.entityName, predicate: nil)
    let iterations = getNumberOfEventCallIterations(eventCount)
    print("iterations.... \(iterations)")
    
    var fetchRequests: [NSFetchRequest<NSFetchRequestResult>] = []
    (1...iterations).enumerated().forEach { index in
        let fetchReq = coredataManager.fetchRequest(Event.entityName,
                                                    context: coredataManager.backgroundObjectContext!,
                                                    predicate: nil,
                                                    sortedBy: "trackedAt",
                                                    ascending: false)
        fetchReq.fetchLimit = 10
        fetchReq.fetchOffset = index.offset * 10
        fetchRequests.append(fetchReq)

        persistence.deleteEvents(fetchRequest: fetchReq, context: coredataManager.backgroundObjectContext!) { _ in
            logger.debug(withMessage: "Deleting all events")
            // semaphore.signal()
        }
    }
}


func batchDelete(_ request: NSFetchRequest<NSFetchRequestResult>,
                 _ context: NSManagedObjectContext,
                 completion: CoreDataOperationHandler? = nil) {
    let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: request)
    batchDeleteRequest.resultType = .resultTypeObjectIDs
    do {
        guard let result = try context.execute(batchDeleteRequest) as? NSBatchDeleteResult else {
            completion?(.failure(.deleteFailed(error: NSError(domain: "No Result from batch request", code: 1, userInfo: nil))))
            return
        }
        guard let resultObject = result.result as? [NSManagedObjectID] else {
            completion?(.failure(.deleteFailed(error: NSError(domain: "Result object type cast to NSManagedObjectID failed", code: 2, userInfo: nil))))
            return
        }
        let changes: [AnyHashable: Any] = [
            NSDeletedObjectsKey: resultObject
        ]
        NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [context])
        completion?(.success(()))
    } catch {
        completion?(.failure(.deleteFailed(error: error as NSError)))
        GaugeSDK.trackEvent(name: TelemetryEvents.telemetryError.rawValue, type: .error, attributes: [.name: "error in batch deletion",
                                                                                                      .description: error.localizedDescription])
        logger.error(withMessage: "error in batch delete \(error.localizedDescription)", category: .coredata)
    }
}
4

0 回答 0