如何在CoreData中保存UILocalNotifications

时间:2016-06-29 19:31:15

标签: swift core-data xcode7 nsdata uilocalnotification

答案如下,图片在这里:

enter image description here

1 个答案:

答案 0 :(得分:2)

我正在搜索如何执行此操作几天,并且只能找到在 NSUserDefaults 中存储 UILocalNotificaations 的人。在 NSUserDefaults 中保存它们对我来说似乎不对,因为它应该用于小标记。我刚才终于想出如何在 CoreData 中存储通知。这是使用Xcode 7.3.1和Swift 2.2

首先,您需要在CoreDataModel中创建一个新的实体 然后为其添加一个属性。该属性应该是二进制数据类型我命名我的表/实体" ManagedFiredNotifications"和我的属性"通知"。它应该是这样的:

上面问题中链接的图片。

接下来你需要为 UILocalNotification 添加一个扩展名,它应该是这样的:

extension UILocalNotification { 
   func save() -> Bool {
      let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate
      let firedNotificationEntity = NSEntityDescription.insertNewObjectForEntityForName("ManagedFiredNotifications", inManagedObjectContext: appDelegate!.managedObjectContext)

      guard appDelegate != nil else {
         return false
      }

      let data = NSKeyedArchiver.archivedDataWithRootObject(self)

      firedNotificationEntity.setValue(data, forKey: "notification")

      do {
         try appDelegate!.managedObjectContext.save()
         return true
      } catch {
         return false
      }
   }
}

现在要保存通知,您需要做的就是调用

UILocalNotification.save()

在您要保存的通知上。我的通知被命名为' notice'所以我打电话给notification.save()

要检索通知,您需要一个像这样的方法

func getLocalFiredNotifications() -> [UILocalNotification]? {
    let managedObjectContext = (UIApplication.sharedApplication().delegate as? AppDelegate)!.managedObjectContext
    let firedNotificationFetchRequest = NSFetchRequest(entityName: "ManagedFiredNotifications")
    firedNotificationFetchRequest.includesPendingChanges = false

    do {
        let fetchedFiredNotifications = try managedObjectContext.executeFetchRequest(firedNotificationFetchRequest)
        guard fetchedFiredNotifications.count > 0 else {
            return nil
        }


        var firedNotificationsToReturn = [UILocalNotification]()
        for managedFiredNotification in fetchedFiredNotifications {

            let notificationData = managedFiredNotification.valueForKey("notification") as! NSData
            let notificationToAdd = NSKeyedUnarchiver.unarchiveObjectWithData(notificationData) as! UILocalNotification

            firedNotificationsToReturn.append(notificationToAdd)
        }
        return firedNotificationsToReturn
    } catch {
        return nil
    }

}

请注意,这会返回一个UILocalNotifications数组。

如果您计划删除其中的一些然后再次存储列表,那么在检索这些内容时,您应该在获取这些内容时将其删除:

func loadFiredNotifications() {
    let notifications = StudyHelper().getLocalFiredNotifications()
    if notifications != nil {
        firedNotifications = notifications!
    } else {
        // throw an error or log it
    }
    classThatRemoveMethodIsIn().removeFiredLocalNotifications()
}

我希望这可以帮助那些遇到与我试图实现相同问题的人。