2016-10-04 6 views
0

次のコードは、アプリケーション代理人に1日に1回、という割り当てを新たに追加する予定です。問題は、アプリが開かれるたびに、その日が変更されていなくても新しい割り当てが追加されることです。アプリが開かれるたびにNSCalendarDayChangedが投稿されているようです。私はに変更することができますどのようなNSCalendarDayChangedは日を変更せずに投稿しています

var assignments = [Assignment]() 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    if let _ = loadHW(){ 
     assignments = loadHW()! 
    } 

    if let assignment = NSKeyedUnarchiver.unarchiveObject(withFile: Assignment.ArchiveURL.path) as? [Assignment]{ 
     assignments = assignment 
    } 

    // Define identifier 
    let notificationName = Notification.Name("NSNotification.Name.NSCalendarDayChanged") 

    // Register to receive notification 
    NotificationCenter.default.addObserver(self, selector: #selector(calendarDayDidChange(notification:)), name: notificationName, object: nil) 

    // Post notification 
    NotificationCenter.default.post(name: notificationName, object: nil) 


    // Override point for customization after application launch.NSNotification.Name.NSCalendarDayChanged 
    return true 
} 
func calendarDayDidChange(notification : NSNotification) 
{ 
    let currentDate = Date() 
    let dateFormatter = DateFormatter() 

    let dayOfTheWeek = Calendar(identifier: Calendar.Identifier.gregorian).component(.weekday, from: Date()) 
    print(dayOfTheWeek) 

    dateFormatter.dateFormat = "M/dd/YY" 
    let convertedCurrentDate = dateFormatter.string(from: currentDate) 
    print(convertedCurrentDate) 

    //Adds an assignment based on date comparisons 
    if let dates = NSKeyedUnarchiver.unarchiveObject(withFile: SettingsViewController.datesURL.path) as? [Date] { 
     print(1) 
     if currentDate >= dates[0] && currentDate <= dates[1] { 
      print(2) 
      if let weekendHW = NSKeyedUnarchiver.unarchiveObject(withFile: SettingsViewController.weekendURL.path) as? Bool { 
       print(3) 
       if(weekendHW || (!weekendHW && dayOfTheWeek != 1 && dayOfTheWeek != 7)){ 
        print(4) 
        if assignments.count > 0{ 
         assignments.insert(Assignment(hw: assignments[0].hw, date: convertedCurrentDate)!, at: 0) 
         print(5) 
        }else if assignments.count == 0 { 
         assignments.append(Assignment(hw: "", date: convertedCurrentDate)!) 
         print(6) 
        } 
        saveHW() 
        print("save complete") 
       } 
      } 
     } 
    } 


    //adds assignment on first launch of app 
    if assignments.count == 0 { 
     assignments.append(Assignment(hw: "", date: convertedCurrentDate)!) 
     saveHW() 
    } 

} 
func saveHW() { 
    let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(assignments, toFile: Assignment.ArchiveURL.path) //saves array grades to file defined in Assignment class 

    if !isSuccessfulSave { //Diagnostic 
     print("Save failed") 
    } 
} 

func loadHW() -> [Assignment]? { 
    return NSKeyedUnarchiver.unarchiveObject(withFile: Assignment.ArchiveURL.path) as? [Assignment] //gets array grades from file where saved, defined in Assignment class 

} 

一つだけ割り当てが日ごとに作成されていることを確認?

+0

お知らせを受け取った最後の通知(または最後の割り当ての日付を使用)をメモし、何か他の処理を行う前に現在の日付と比較しますか? – jcaron

+0

実際、オブザーバーを追加した直後の問題は、そのイベントの通知を投稿したことでしょう。 – jcaron

+0

なぜあなたは同じ 'Assignment'オブジェクトを3回まで解凍しますか? – vadian

答えて

0

Not NSCalendarDayChangedはのあなたにが掲載されています。ライン

NotificationCenter.default.post(name: notificationName, object: nil) 

を削除し、それが冗長だ

if let _ = loadHW(){ 
    assignments = loadHW()! 
} 

も削除します。次のif - letの表現はまったく同じです。

関連する問題