2016-09-05 3 views
0

Я сохраняю данные ядра после того, как пользователь завершил «тренировку» и захочет проверить, соответствуют ли даты, которые пользователь разработал, в последовательном порядке. Я использовал приведенный ниже код, чтобы проверить, был ли пользователь разработан в тот день, который нажал на календарь, но не может подумать, как проверить, соответствуют ли дни.Основные данные: как проверить, находятся ли данные в последовательных датах?

Сначала я думал о том, чтобы взять .Day из сохраненного NSDate и посмотреть, будут ли дни в порядке, но это не сработает в течение последовательных дней, когда месяц изменится, например. с 31-го по 1-й месяц.

let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
let context: NSManagedObjectContext = appDel.managedObjectContext 

OuterLoop: do { 
    let request = NSFetchRequest(entityName: "Workout") 
    let workoutResults = try context.executeFetchRequest(request) as! [Workout] 

    if workoutResults.count > 0 { 
     for item in workoutResults { 
      let workoutDateDay = NSCalendar.currentCalendar().component(.Day, fromDate: item.workoutDate!) 

      if workoutDateDay == dayView.date.day { 

       let convertedTime:Int = Int(item.workoutTime!) 
       let convertedNumberOfWorkouts: Int = Int(item.workoutNumber!) 
       tempArray.append(convertedTime) 
       tempArrayWorkoutNumber.append(convertedNumberOfWorkouts) 

ответ

0
func consecutiveDatesCheck(dateArray: [NSDate]) -> Int { 

    // The incoming parameter dateArray is immutable, so first make it mutable 
    var mutableArray = dateArray 

    // Next, sort the incoming array 
    mutableArray.sortInPlace({ $0.compare($1) == NSComparisonResult.OrderedAscending }) 

    var x = 0 
    var numberOfConsecutiveDays = 1 
    var streakArray = [Int]() 

    // Cycle through the array, comparing the x and x + 1 elements 
    while x + 1 < mutableArray.count { 

     let calendar: NSCalendar = NSCalendar.currentCalendar() 
     let components = calendar.components(.Day, fromDate: mutableArray[x], toDate: mutableArray[x + 1], options: []) 

     // If the difference between the dates is greater than 1, append the streak to streakArray and reset the counter 
     if abs(components.day) > 1 { 
      streakArray.append(numberOfConsecutiveDays) 
      numberOfConsecutiveDays = 1 
     } 

     // If the difference between the days is exactly 1, add one to the current streak 
     else if abs(components.day) == 1 { 
      numberOfConsecutiveDays += 1 
     } 

     x += 1 
    } 

    // Append the final streak to streakArray 
    streakArray.append(numberOfConsecutiveDays) 
    print(streakArray) 

    // Return the user's longest streak 
    return streakArray.maxElement()! 
} 

затем при вызове функции:

do { 
     let request = NSFetchRequest(entityName: "Workout") 
     let workoutResults = try context.executeFetchRequest(request) as! [Workout] 

     if workoutResults.count > 0 { 

      // Declare a new empty array 
      var dateArray = [] 

      for item in workoutResults { 
       dateArray.append(item.workoutDate!) 
      } 

      consecutiveDatesCheck(dateArray) 
     } 
    } catch { 
     print("Error loading data") 
    } 
+0

Спасибо за ваш ответ, это хорошо работает на 2 даты, но как я могу настроить этот код, чтобы проверить, если более чем на 2 даты (например, 10 дат) подряд? –

+0

Выполняет ли обновленный код то, что вам нужно? –

+0

Пытаясь это сделать, я борюсь с тем, как добавить параметр основных данных в вашу функцию. Мое имя сущности - тренировка, и она имеет два атрибута; workoutDate и workoutTime. workoutDate имеет тип NSDate, и это значения, которые я хочу проверить, в порядке. –

Смежные вопросы