2015-06-02 1 views
-1

У меня есть программа, которая имеет объекты 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 минуты от самого последнего объекта в основных данных? Это позволяет мне спамить только после первой минуты, не обновляя дату до самого последнего значения.

Я новый программист, и я не могу понять это. Надеюсь, это нечто глупое, которого я просто не вижу! Любая помощь оценивается.

+0

Это определенно выглядит проблемой, которая начинается с попытки №3. Я бы посмотрел, как выглядит «newPlace» после вставки и выполняет некоторую проверку ошибок вокруг «save». (Он возвращает bool и принимает параметр ошибки.) –

+0

Отредактировано мое сообщение, чтобы включить «newPlace.date = now», который выполняется в makePlaces(). – Charlie

+0

В конце концов понял это - не имел никакого отношения к CoreData. Я устанавливал newPlace.date = now - эта переменная 'now' была установлена ​​в NSDate() только в начале программы, то есть она всегда была одинаковой для каждого введенного элемента. Глупая ошибка! Надеюсь, кто-то поможет кому-то! – Charlie

ответ

0

В конце концов выяснил это - не имел никакого отношения к CoreData. Я устанавливал newPlace.date = now - эта переменная 'now' была установлена ​​в NSDate() только в начале программы, то есть она всегда была одинаковой для каждого введенного элемента. Глупая ошибка! Надеюсь, кто-то поможет кому-то!