Я получил
Ошибка домена = NSCocoaErrorDomain Code = 1570 "Операция не может быть завершена. (Ошибка какао 1570.)" "
ошибка двух функцийэто раньше работало.
Первая deleteOrder()
- это функция, которая вызывается наблюдателем Firebase.Чтобы решить проблему автономного устройства, я изменил логику для удаленных записей с простого удаления их, чтобы также записать их в выделенный узел "Deleted Orders"
, и после того, как я изменил наблюдателя с .childRemoved
на "Orders"
узле на childAdded
наУзел "Deleted Orders"
Я заявил, что получаю эту ошибку.deleteOrder()
не изменился, но теперь CoreData
выдает ошибку при сохранении.Насколько я знаю и выяснил, (Cocoa error 1570.)
- это некий необязательный параметр при сохранении в CoreData
, как я испытывал ранее с функцией saveOrder()
, но при удалении из CoreData
я не могу это объяснить.
Я также получаю ту же ошибку только от одной из двух функций, которые поддерживают обновление запасов при получении заказов или отмены заказов.decrementInventory()
отлично работает при получении нового заказа, но incrementInventory()
выдает (Cocoa error 1570.)
при получении отмены заказа.Можете ли вы помочь мне определить, где ошибка?Я смотрел на различия в кодах между decrementInventory()
и incrementInventory()
, но они делают точные вещи прямо противоположным образом.
Как всегда, бесконечно, спасибо за ваше время и помощь.
Функции:
Наблюдатель Firebase:
static func getDeletedOrders(completed: @escaping (Bool) -> ()) {
print("getDeletedOrders() : started")
let ref = Database.database().reference()
// Deleted Orders
// Using .childAdded on new Deleted Orders node
ref.child("Continent").child("Europe").child("Country").child(UserDetails.country!).child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Shops").child(UserDetails.fullName!).child("Deleted Orders").observe(.childAdded, with: { (snapshot) in
print("snapshot is: \(snapshot)")
guard let value = snapshot.value as? [String : String] else {return}
let orderId = value["Order Id"]!
let customerName = value["User Name"]!
let customerFcmToken = value["User fcmToken"]!
let itemsIdList = value["Items Id List"]!
do {
try Order.deleteOrder(completed: { (true) in
if #available(iOS 10.0, *) {
// Local Notification
let actions: [UNNotificationAction] = [UNNotificationAction(identifier: "chiudi", title: "Chiudi", options: [.foreground])]
LocalNotifications.newTimeIntervalNotification(notificationType: "Deleted order", actions: actions, categoyIdentifier: "Deleted order", title: "Ordine", body: "Un ordine è stato cancellato", userInfo: [:], timeInterval: 0.1, repeats: false)
} else if #available(iOS 9.0, *){
// Local Notification
LocalNotifications.newTimeIntervalNotification(notificationType: "Deleted order", actions: [], categoyIdentifier: "Deleted order", title: "Ordine", body: "Un ordine è stato cancellato", userInfo: [:], timeInterval: 0.1, repeats: false)
}
// // send push to customer
// PushNotifications.sendPushNotification(to: customerFcmToken, title: "Order number: \(String(describing: orderId))", subtitle: " Shop: \(String(describing: UserDetails.fullName!))", body: "Thank you \(customerName) we received your order cancellation. We'll be happy to see you next time you shop with us again. Bye.")
// localized push
PushNotifications.sendPushNotification(to: customerFcmToken, title: String(format: NSLocalizedString( "ORDER_DELETED_PUSH_TITLE", comment: ""), orderId), subtitle: String(format: NSLocalizedString( "ORDER_DELETED_PUSH_SUBTITLE", comment: ""), UserDetails.fullName!), body: String(format: NSLocalizedString("ORDER_DELETED_PUSH_BODY", comment: "") , customerName))
} ,orderId: orderId, itemsIdList: itemsIdList)
print("getDeletedOrders() : ended, now observing")
completed(true)
} catch {
print("getDeletedOrders() : Error in saving snapshot to Core Data : \(error)")
}
})
}
deleteOrder ():
static func deleteOrder(completed: @escaping(Bool) -> (), orderId: String, itemsIdList: String) throws {
let context = CoreData.databaseContext
let request: NSFetchRequest<Order> = Order.fetchRequest()
request.sortDescriptors = [NSSortDescriptor( key: "orderId", ascending: true)]
request.predicate = NSPredicate(format: "orderId == %@", orderId)
do {
let fetch = try context.fetch(request)
if fetch.count > 0 {
for value in fetch {
do {
print("Order.deleteOrder() : fetch.count is: \(fetch.count)")
print("Order.deleteOrder() : found order is: \(value)")
context.delete(value)
print("Order.deleteOrder() : Order deleted")
var productIdListArray:[String] = value.itemsIdList!.components(separatedBy: ",")
for product in 0..<productIdListArray.count {
do {
try Product.incrementIventory(completed: { (true) in
print("Order.deleteOrder() : Inventory seccessfully updated after order cancellation")
}, productId: productIdListArray[product])
} catch {
print("Error in incrementing inventory : \(error)")
}
}
}
do {
try context.save()
print("Order.deleteOrder() : Order deletion is saved")
completed(true)
} catch {
print("Order.deleteOrder() : Error saving Order deletion: \(error)")
}
}
}
} catch {
print("Order.deleteOrder() : Erron: Order not found")
}
}
incrementInventory ():
static func incrementIventory(completed: @escaping (Bool) -> (), productId: String) throws {
print("Product.incrementIventory() : started")
let context = CoreData.databaseContext
let request: NSFetchRequest<Product> = Product.fetchRequest()
request.predicate = NSPredicate(format: "productId == %@", productId)
do {
let fetch = try context.fetch(request)
print("Product.incrementIventory(): fetching product")
if fetch.count > 0 {
for value in fetch {
// if value.productId == productId {
if #available(iOS 10.0, *) {
let newAvailableQuantity = Int(value.availableQuantity!)! + 1
let newSoldQuantity = Int(value.soldQuantity!)! - 1
value.setValue(String(describing: newAvailableQuantity) , forKey: "availableQuantity")
value.setValue(String(describing: newSoldQuantity), forKey: "soldQuantity")
let ref = Database.database().reference()
ref.child("Continent").child("Europe").child("Country").child("\(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("\(productId)").child("Available Quantity").setValue(String(describing: newAvailableQuantity))
ref.child("Continent").child("Europe").child("Country").child("\(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("\(productId)").child("Sold Quantity").setValue(String(describing: newSoldQuantity))
} else {
// Fallback on earlier versions
let newAvailableQuantity = Int(value.availableQuantity!)! + 1
let newSoldQuantity = Int(value.soldQuantity!)! - 1
value.setValue(String(describing: newAvailableQuantity) , forKey: "availableQuantity")
value.setValue(String(describing: newSoldQuantity), forKey: "soldQuantity")
let ref = Database.database().reference()
ref.child("Continent").child("Europe").child("Country").child("\(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("\(productId)").child("Available Quantity").setValue(String(describing: newAvailableQuantity))
ref.child("Continent").child("Europe").child("Country").child("\(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("\(productId)").child("Sold Quantity").setValue(String(describing: newSoldQuantity))
}
// }
}
}
} catch {
print("Product.incrementIventory(): Error in fetching a product : \(error)")
}
do {
try context.save()
print("Product.incrementIventory(): modified product is saved to Core Data")
completed(true)
} catch {
print("Product.incrementIventory(): Error saving modified product to Core Data : \(error)")
}
}
и правильно работающие decmentInventory ():
static func decrementIventory(completed: @escaping (Bool) -> (), productId: String) throws {
print("Product.decrementIventory() : started")
let context = CoreData.databaseContext
let request: NSFetchRequest<Product> = Product.fetchRequest()
request.predicate = NSPredicate(format: "productId == %@", productId)
do {
let fetch = try context.fetch(request)
print("Product.decrementIventory() : fetching product")
if fetch.count > 0 {
for value in fetch {
// if value.productId == productId {
if #available(iOS 10.0, *) {
let newAvailableQuantity = Int(value.availableQuantity!)! - 1
let newSoldQuantity = Int(value.soldQuantity!)! + 1
value.setValue(String(describing: newAvailableQuantity) , forKey: "availableQuantity")
value.setValue(String(describing: newSoldQuantity), forKey: "soldQuantity")
let ref = Database.database().reference()
ref.child("Continent").child("Europe").child("Country").child("\(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("\(productId)").child("Available Quantity").setValue(String(describing: newAvailableQuantity))
ref.child("Continent").child("Europe").child("Country").child("\(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("\(productId)").child("Sold Quantity").setValue(String(describing: newSoldQuantity))
} else {
// Fallback on earlier versions
let newAvailableQuantity = Int(value.availableQuantity!)! - 1
let newSoldQuantity = Int(value.soldQuantity!)! + 1
value.setValue(String(describing: newAvailableQuantity) , forKey: "availableQuantity")
value.setValue(String(describing: newSoldQuantity), forKey: "soldQuantity")
let ref = Database.database().reference()
ref.child("Continent").child("Europe").child("Country").child("\(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("\(productId)").child("Available Quantity").setValue(String(describing: newAvailableQuantity))
ref.child("Continent").child("Europe").child("Country").child("\(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("\(productId)").child("Sold Quantity").setValue(String(describing: newSoldQuantity))
}
// }
}
}
} catch {
print("Product.decrementIventory() : Error in fetching a product : \(error)")
}
do {
try context.save()
print("Product.decrementIventory() : modified product is saved to Core Data")
// setting completion for decrementIventory() here causes inconsistency in Firebase, so we set completion for decrementIventory() in Firebase.uploadProduct completed scope
completed(true)
} catch {
print("Product.decrementIventory() : Error saving modified product to Core Data : \(error)")
}
}