当应用程序在后台运行时,我需要从一个推送通知将 2 个实体的记录插入到 coredata 中,但是当我尝试插入时,它会在从现有记录中获取数据时停止执行,并在发生另一个通知或用户单击通知后继续。我希望在用户未单击推送通知且应用程序处于后台状态时插入数据。
这是我获取记录和插入的代码部分:
static func insertFromNotificationMessage(_ context: NSManagedObjectContext, message: [AnyHashable: Any]) -> myData{
var myData : myData?
context.performAndWait {
myData = NSEntityDescription.insertNewObject(
forEntityName: "myData", into: context) as? myData
myData?.guid = message["id"] as? String
myData?.title = message["ttl"] as! String
let anotherData = anotherData.getByUUID(context, UUID: message["id"] as! String) ?? anotherData.insertFromNotificationMessage(context, details: message)
myData?.author = author
do{
try context.saveContextAndWait()
}catch let error{
print("Error(error)")
}
}
return myData!
}
static func getByUUID(_ context: NSManagedObjectContext, UUID : String)-> anotherData?{
let fetchSingleRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "anotherData")
fetchSingleRequest.predicate = NSPredicate(format: "guid =[c] %@", UUID)
do{
let fetchedUser = try context.fetch(fetchSingleRequest) as! [anotherData]
if fetchedUser.count > 0{
return fetchedUser.first
}
}catch{
print("Failed to fetch: (error)")
}
return nil
}
在应用程序委托中执行此操作:
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
YOUR OBJECT CLASS.saveMessage(userInfo) // code to save into core data
completionHandler(.NewData)
}
这是我保存数据的示例函数
static func saveMessage(userInfo: [NSObject : AnyObject]) -> Message {
let alertInfo = userInfo["aps"]?["alert"]!
let title:String?
let body:String?
if let alertTitle = alertInfo!["title"] as? String{
title = alertTitle
body = alertInfo!["body"] as? String
} else {
title = userInfo["title"] as? String ?? "CUSTOM TITLE"
body = alertInfo as? String
}
let message = Message(date: NSDate(), title: title!, message: body!, isReaded: false)
DBUtil.saveContext()
return message
}