У меня есть программа, которая имеет объекты CoreData, включая поле NSDate, которое указывает дату, когда каждый объект был сохранен.CoreData Fetch (сортировка по дате) - не обновляется для новых данных?
Я хочу убедиться, что пользователь не выполнил «экономящий» код в течение X минут (при тестировании установлен на 1). Если это за X минут, не добавляйте дополнительный объект в контекст, просто выполните оставшуюся часть кода ... в противном случае сохраните, затем выполните.
Вот начало кода, который создает новый объект:
func makePlaces (NSObject: AnyObject) {
let objectCount = checkCoreForObjects()
//if objects exist in coredata
if objectCount > 0 {
//check what the difference from latest entry is
var latestPlace = getLatestPlace()
println(latestPlace[0].date.timeIntervalSinceNow/60)
if floor(latestPlace[0].date.timeIntervalSinceNow/60) >= -1 {
println("within 1 minute")
return
} else {
println("more than 1 minute")
}
}
let newPlace = NSEntityDescription.insertNewObjectForEntityForName("Place",
inManagedObjectContext: self.managedObjectContext!) as! Place
newPlace.date = now
//lots of other working code has been removed here for clarity
self.managedObjectContext!.save(nil)
Это «getLatestPlace()» метод, который возвращает последнюю дату (или я так думаю ...):
func getLatestPlace() -> [Place] {
var error: NSError? = nil
let request = NSFetchRequest(entityName: "Place")
let sortDescriptor = NSSortDescriptor(key: "date", ascending: false)
let sortDescriptors = [sortDescriptor]
request.sortDescriptors = sortDescriptors
request.fetchLimit = 1
var latestPlace = self.managedObjectContext?.executeFetchRequest(request, error: &error) as! [Place]
println("latestPlaces count: \(latestPlace.count)")
println("latesttime is \(latestPlace[0].date)")
return latestPlace
}
Это консольный вывод:
//FIRST SAVE ATTEMPT
latestPlaces count: 1
latest date save is 2015-06-02 17:02:00 +0000
-24.5014304161072
more than 1 minute
//SECOND SAVE ATTEMPT (was within 1 min, latest date save did update)
latestPlaces count: 1
latest date save is 2015-06-02 17:26:17 +0000
-0.463125466307004
within 1 minute
//THIRD SAVE ATTEMPT (was after 1 min)
latestPlaces count: 1
latest date save is 2015-06-02 17:26:17 +0000
-1.39080496629079
more than 1 minute
//FOURTH SAVE ATTEMPT (was within 1 min, latest date save DIDNT update?!)
latestPlaces count: 1
latest date save is 2015-06-02 17:26:17 +0000
-1.47449685037136
more than 1 minute
TLDR: Почему «Fourt h Сохранить попытку "в консоли, не указывая должным образом, что попытка сохранения была в течение 1 минуты от самого последнего объекта в основных данных? Это позволяет мне спамить только после первой минуты, не обновляя дату до самого последнего значения.
Я новый программист, и я не могу понять это. Надеюсь, это нечто глупое, которого я просто не вижу! Любая помощь оценивается.
Это определенно выглядит проблемой, которая начинается с попытки №3. Я бы посмотрел, как выглядит «newPlace» после вставки и выполняет некоторую проверку ошибок вокруг «save». (Он возвращает bool и принимает параметр ошибки.) –
Отредактировано мое сообщение, чтобы включить «newPlace.date = now», который выполняется в makePlaces(). – Charlie
В конце концов понял это - не имел никакого отношения к CoreData. Я устанавливал newPlace.date = now - эта переменная 'now' была установлена в NSDate() только в начале программы, то есть она всегда была одинаковой для каждого введенного элемента. Глупая ошибка! Надеюсь, кто-то поможет кому-то! – Charlie