从小部件扩展访问核心数据
Posted
技术标签:
【中文标题】从小部件扩展访问核心数据【英文标题】:Access core data from widget extension 【发布时间】:2016-07-23 20:39:21 【问题描述】:我正在尝试在今天的小部件扩展中读取核心数据属性。我在这里搜索了很多网站和问题,但我找不到解决方案!到目前为止,我将应用组添加到我的应用中,然后在 App Delegate
中更改此行:
lazy var applicationDocumentsDirectory: NSURL =
// file. This code uses a directory named "compony.AppName" in the application's documents Application Support directory.
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
return urls[urls.count-1]
()
到:
lazy var applicationDocumentsDirectory: NSURL? =
return NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.myDomain.appgroupID") ?? nil
()
那么下一步是什么?如何从小部件中心访问上下文实体等...?如果有人帮助我,我将不胜感激。
我只有一个entity
和几个attributes
。
编辑
我创建了一个CoreDataStack.swift
并将所有核心数据文件从AppDelegate
复制到新文件中。
将我的数据模型添加到小部件扩展中:
在扩展 viewDidLoad
我厌倦了从模型中检索数据,但是当我运行小部件时没有任何反应:
context = CoreDataStack.defaultStack.managedObjectContext
do
request = NSFetchRequest(entityName: "Event")
results = try context.executeFetchRequest(request)
print(results.count)
if results.count > 0
for item in results as! [NSManagedObject]
let name = item.valueForKey("title")
print(name!)
//end if
catch
print("there is an error for saving")
【问题讨论】:
您是否遵循了所有必要的步骤?例如invasivecode.com/weblog/… @LorenzoBoaro 这是我见过的最愚蠢的教程!标题是关于核心数据和今天的扩展,但是当你遵循最后一步时!它说,核心数据并不总是好的!!!!!!!!!使用 NSUserDefualts !!!!!!!!!!!!!!! 【参考方案1】:由于小部件没有应用委托,您可能希望将核心数据堆栈代码移出主应用中的应用委托类。
我通常使用一个名为CoreDataStack
的类。只需将所有方法复制到这个新类中,将lazy
更改为static
:
class CoreDataStack
static var applicationDocumentsDirectory: NSURL? = ... ()
static var managedObjectModel: NSManagedObjectModel = ... ()
static var persistentStoreCoordinator: NSPersistentStoreCoordinator? = ... ()
static var managedObjectContext: NSManagedObjectContext? = ... ()
由于这些都是static
变量,您可以使用以下语法访问托管上下文:
let ctx = CoreDataStack.managedObjectContext
...而不是通过您的应用委托进行典型访问。
您应该将此文件添加到您的主应用程序目标和小部件目标中,使用“目标成员资格”下的右侧边栏。这样,您将在两个地方以相同的方式访问您的核心数据堆栈。您需要对所有模型执行相同操作,以确保它们在扩展中可用。
【讨论】:
@Mc.Lover 很抱歉...我没有收到您的评论通知。确保您直接使用 CoreDataStack 类,而不是实例化它的实例。如果你粘贴你的班级并告诉我哪里出错了,我可能会在几分钟内提供帮助 还要确保你没有忘记每个静态变量声明末尾的 () 该类不是单例(尽管这是一个可能的解决方案)。你不用 CoreDataStack.defaultStack.managedObjectContext 访问它,你只需使用 CoreDataStack.managedObjectContext @Mc.Lover 如果你给我半个小时,我可以做一个示例项目。什么 Xcode 版本? @Mc.Lover 哇,太棒了! Xcode 7.3.1 ,Swift 2.2,以防我需要在小部件和手表应用程序扩展中使用该核心数据。非常感谢以上是关于从小部件扩展访问核心数据的主要内容,如果未能解决你的问题,请参考以下文章
RUST + FLTK:从小部件 on_push() 函数访问另一个小部件