2016-06-16 15 views
0

1週間後にユーザーがアプリを起動したときにバックグラウンドで1週間に1回切り替えることができます。ユーザーがその週にアプリを使用すると、毎日値が変わります。 variable b to falseしかし、週に1度、その変数がfalseになっている任意の日にその変数をtrueに戻したいと思います。私はAppDelegate's didFinishLaunchingWithOptionsに入れようとした機能を持っていますが、チェックの仕方が正確ではないので、うまく動作しませんでした。これは私の試みです:タスクを週に1回または定期的に実行するiOS

func resetOnSunday() { 

     let date = NSDate() 
     let formatter = NSDateFormatter() 
     let timeFormatter = NSDateFormatter() 
     formatter.dateFormat = "EEEE" 
     let WeekDay = formatter.stringFromDate(date) 

     timeFormatter.dateFormat = "HH:mm a" 
     let time = timeFormatter.stringFromDate(date) 
     if time >= "00:00 AM" && time <= "00:02 AM" && WeekDay == "Sunday" { 

var b = true 

     } 

    } 

どのように行うことができますか?ありがとう。

+0

あなたのアプローチは間違っています。最後の更新の日付と値を保存するだけで済みます。アプリケーションが開いたら、すべての変更を直接行う必要があります。実際の変更を模倣することはバックグラウンドで起こり、ユーザーは実際の最新の現在の値のみを表示します。たとえば、毎週日曜日に1ずつカウンターを増やし、現在の値(たとえば2など)と現在の日付を保存する必要があります。また、ユーザーが5週間後にアプリを開くと、最後に日曜日をカウントする必要がありますカウンターを更新して増やす5のため、ユーザーは更新された値7を直ちに参照します。 – holex

答えて

2

まず、NSCalendarを使用すると、コードを大幅に減らすことができます(さらに信頼性を高めることができます)。

let date = NSDate() 
let calendar = NSCalendar.currentCalendar() 
//This will return a NSDate optional which you can check against. 
let nextSunday = calendar.nextDateAfterDate(date, matchingUnit: .Weekday, value: 1, options: .MatchNextTime) 

if date.timeIntervalSinceDate(nextSunday!) > 0 { 
    //Do your stuff here 
} 

なお:

平日単位nは、週の日数である数nを1、です。たとえば、グレゴリオ暦では、nは7で、日曜日が1

次で表され、私はあなたの値についてNSUserDefaults使用します。

let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setBool(true, forKey: "yourVar") 

//Then to read it 
defaults.boolForKey("yourVar") 
+1

これは素晴らしいです。ありがとう@クリス。 NSUserDefaultsは実際にはるかに優れています。 ;) – Gugulethu

+0

いいえ問題は@Gugulethu :) – Chris

関連する問題