当应用程序处于后台时,从推送通知插入核心数据记录



当应用程序在后台运行时,我需要从一个推送通知将 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
}

最新更新