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
}
一つだけ割り当てが日ごとに作成されていることを確認?
お知らせを受け取った最後の通知(または最後の割り当ての日付を使用)をメモし、何か他の処理を行う前に現在の日付と比較しますか? – jcaron
実際、オブザーバーを追加した直後の問題は、そのイベントの通知を投稿したことでしょう。 – jcaron
なぜあなたは同じ 'Assignment'オブジェクトを3回まで解凍しますか? – vadian