У меня есть этот класс сущности для извлечения объекта по его id. Если объект не найден, то создается и возвращается.

  static var request:NSFetchRequest<NSFetchRequestResult> {
    let request: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: String(describing: Self.self))
    request.returnsDistinctResults = true
    request.returnsObjectsAsFaults = true
    return request
  }

 class func readObjectWith(id:String,
                             createIfNotFound:Bool = false,
                             context:NSManagedObjectContext) -> Object? {
    
    // search for the object
    let predicate = NSPredicate(format: "id == \(id)")
    request.predicate = predicate
    
    do {
      guard let result = try context.fetch(request) as? [Object],
            result.count > 0,
            let item = result.first
      else {
        if createIfNotFound == false { return nil }

        print("new item")
        return Object(context: context)
      }
      // item exists, return
      return item
    } catch {
      return nil
    }
  }

Я удаляю все объекты из основных данных. Я запускаю это в цикле. Каждый раз, когда цикл повторяется, он вызывается с разными id и createIfNotFound = true. Часть «новый элемент» просто запустится в первый раз. Во всех остальных случаях будет возвращен первый созданный объект, и идентификатор этого объекта не имеет ничего общего с id, переданным методу.

Зачем?

1
Duck 2 Мар 2021 в 15:18

1 ответ

Лучший ответ

Проверьте, создаете ли вы запрос на выборку для каждого цикла. fetch var - это статическое свойство, которое инициализируется один раз. Это одноразовый объект, который возвращает результаты первого выстрела.

Вы можете сделать это, изменив:

static var request:NSFetchRequest<NSFetchRequestResult>

К

static func freshRequest() -> NSFetchRequest<NSFetchRequestResult>

Также вы, вероятно, захотите установить id в новом объекте Patient перед его возвратом.

let patient =  Patient(context: context)
patient.id = id
return patient
1
Warren Burton 2 Мар 2021 в 12:54