NSBatchInsertRequest iOS17 problems

Hello, I am using NSBatchInsertRequest to insert 5-6k items. With the release of iOS 17, I've encountered issues with populating optional fields. In cases where an optional field is nil, the field gets filled with a value from another message where this field is present.

extension MOTransactionDetails {

@nonobjc public class func fetchRequest() -> NSFetchRequest<MOTransactionDetails> {
    return NSFetchRequest<MOTransactionDetails>(entityName: "MOTransactionDetails")
}

@NSManaged public var accountAmountCurrencyCode: String?
@NSManaged public var accountAmountValue: Int64
@NSManaged public var accountNumber: String?
@NSManaged public var accountOwnerName: String?
@NSManaged public var accountType: String?
@NSManaged public var balanceAfterCurrencyCode: String?
@NSManaged public var balanceAfterValue: Int64
@NSManaged public var cardNumber: String?
@NSManaged public var cashbackCurrencyCode: String?
@NSManaged public var cashbackValue: Int64
@NSManaged public var comment: String?
@NSManaged public var commissionAmountCurrencyCode: String?
@NSManaged public var commissionAmountValue: Int64
@NSManaged public var embossingName: String?
@NSManaged public var exchangeRate: Double
@NSManaged public var id: String?
@NSManaged public var ownAmountCurrencyCode: String?
@NSManaged public var ownAmountValue: Int64
@NSManaged public var sourceSystemTransactionRef: String?
@NSManaged public var structuredReference: String?
@NSManaged public var transactionDate: Date?
@NSManaged public var actions: NSSet?
@NSManaged public var transactionItem: MOTransactionItem?

}

var detailsDictionaryValue: [String: Any] { var value: [String: Any] = [:] let details = self.transactionDetails

    value[#keyPath(MOTransactionDetails.id)] = self.id
    value[#keyPath(MOTransactionDetails.sourceSystemTransactionRef)] = details.sourceSystemTransactionRef
    value[#keyPath(MOTransactionDetails.transactionDate)] = details.transactionDate
    value[#keyPath(MOTransactionDetails.accountAmountValue)] = Int64(details.accountAmount.amount)
    value[#keyPath(MOTransactionDetails.accountAmountCurrencyCode)] = details.accountAmount.currency.currencyCode
    
    if let commission = details.commissionAmount {
        value[#keyPath(MOTransactionDetails.commissionAmountValue)] = Int64(commission.amount)
        value[#keyPath(MOTransactionDetails.commissionAmountCurrencyCode)] = commission.currency.currencyCode
    } else {
        value[#keyPath(MOTransactionDetails.commissionAmountValue)] = NSNull()
        value[#keyPath(MOTransactionDetails.commissionAmountCurrencyCode)] = NSNull()
    }
    
    if let balanceAfter = details.balanceAfter {
        value[#keyPath(MOTransactionDetails.balanceAfterValue)] = Int64(balanceAfter.amount)
        value[#keyPath(MOTransactionDetails.balanceAfterCurrencyCode)] = balanceAfter.currency.currencyCode
    } else {
        value[#keyPath(MOTransactionDetails.balanceAfterValue)] = NSNull()
        value[#keyPath(MOTransactionDetails.balanceAfterCurrencyCode)] = NSNull()
    }
    
    if let ownAmount = details.ownAmount {
        value[#keyPath(MOTransactionDetails.ownAmountValue)] = Int64(ownAmount.amount)
        value[#keyPath(MOTransactionDetails.ownAmountCurrencyCode)] = ownAmount.currency.currencyCode
    } else {
        value[#keyPath(MOTransactionDetails.ownAmountValue)] = NSNull()
        value[#keyPath(MOTransactionDetails.ownAmountCurrencyCode)] = NSNull()
    }
    
    if let cashback = details.cashback {
        value[#keyPath(MOTransactionDetails.cashbackValue)] = Int64(cashback.amount)
        value[#keyPath(MOTransactionDetails.cashbackCurrencyCode)] = cashback.currency.currencyCode
    } else {
        value[#keyPath(MOTransactionDetails.cashbackValue)] = NSNull()
        value[#keyPath(MOTransactionDetails.cashbackCurrencyCode)] = NSNull()
    }
    
    if let exchangeRate = details.exchangeRate {
        value[#keyPath(MOTransactionDetails.exchangeRate)] = exchangeRate
    } else {
        value[#keyPath(MOTransactionDetails.exchangeRate)] = NSNull()
    }
    
    if let comment = details.comment {
        value[#keyPath(MOTransactionDetails.comment)] = comment
    } else {
        value[#keyPath(MOTransactionDetails.comment)] = NSNull()
    }
    
    if let structuredReference = details.structuredReference {
        value[#keyPath(MOTransactionDetails.structuredReference)] = structuredReference
    } else {
        value[#keyPath(MOTransactionDetails.structuredReference)] = NSNull()
    }
    
    // requisite
    let requisite = details.cardAccountRequisite
    value[#keyPath(MOTransactionDetails.accountNumber)] = requisite.accountNumber
    value[#keyPath(MOTransactionDetails.accountType)] = requisite.accountType.rawValue
    
    if let accountOwnerName = requisite.accountOwnerName {
        value[#keyPath(MOTransactionDetails.accountOwnerName)] = accountOwnerName
    } else {
        value[#keyPath(MOTransactionDetails.accountOwnerName)] = NSNull()
    }
    
    if let cardNumber = requisite.cardNumber {
        value[#keyPath(MOTransactionDetails.cardNumber)] = cardNumber
    } else {
        value[#keyPath(MOTransactionDetails.cardNumber)] = NSNull()
    }
    
    if let embossingName = requisite.embossingName {
        value[#keyPath(MOTransactionDetails.embossingName)] = embossingName
    } else {
        value[#keyPath(MOTransactionDetails.embossingName)] = NSNull()
    }
    
    return value
}

// This solution solves the problem! On iOS 16 there is no such problem, everything works correctly.

NSBatchInsertRequest iOS17 problems
 
 
Q