- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在开发一个带有 Today Extension 的 iPhone 应用程序。该应用程序有一个模型模块,可从 NSUserDefaults
加载/保存到该模块。由于我希望主应用程序和扩展程序都可以使用此信息,因此我使用了一个应用程序组:
let storage = NSUserDefaults(suiteName: "group.etc.etc.etc...")
应用程序和扩展程序都可以毫无问题地访问信息。
主应用偶尔会创建一个本地通知来呈现给用户。该通知有两个与之关联的操作 (UIUserNotificationAction
)。这些操作之一会触发一些代码在主应用程序的后台运行。该代码更改 NSUserDefaults
信息并触发同步。我的代码是这样的:
func application(application: UIApplication, handleActionWithIdentifier id: String?, forLocalNotification not: UILocalNotification, completionHandler: () -> ()) {
// Interact with model here
// New information gets saved to NSUserDefaults
userDefaultsStorage.synchronize()
completionHandler()
}
现在,在今天的分机上。我很自然地观察到对 NSUserDefaults
上的信息所做的任何更改,以便我可以重新加载小部件上的界面:
override func viewDidLoad() {
super.viewDidLoad()
// ...
NSNotificationCenter.defaultCenter().addObserverForName(NSUserDefaultsDidChangeNotification, object: nil, queue: NSOperationQueue.mainQueue()) { _ in
self.reload()
}
}
现在,这是我的问题:
主应用程序安排 UILocalNotification。我打开今天 View 并查看我的今天小部件。
当通知触发时,屏幕顶部会出现一个横幅。
我在该横幅上向下滑动以显示这两个操作,然后选择我之前提到的一个(今日小部件仍在屏幕上)。
我知道该操作在后台正确运行,并且正在对 NSUserDefaults
上的信息进行更改。
但是,即使 today widget 一直处于事件状态并一直显示在屏幕上,也不会触发重新加载操作。经过进一步调查,我可以确认 NSUserDefaultsDidChangeNotification
没有被触发(我放置了一个断点但它没有触发,并且还做了一些其他检查)。
我知道通知操作正在进行更改,因为如果我强制重新加载小部件(通过关闭和打开今天 View ),小部件会正确更新。
我在网上看过各种教程,他们说的第一件事就是收听此通知并更新小部件,以便“小部件与 NSUserDefaults
同步”。但问题是 AFAICT 这个通知绝对没用!怎么会??
注意 1:当我从 的今天小部件更改 NSUserDefaults 的信息时,通知会正确触发。
注意 2:顺便说一句,调试今天的小部件绝对是可怕的。在它可以对断点和崩溃使用react之前,总是需要告诉 Xcode“按名称附加到进程...”。 iOS 不断地为小部件创建一个新进程,所以我必须不断地告诉 Xcode 再次附加。
最佳答案
来自 doc这里:
Cocoa includes two types of notification centers: The NSNotificationCenter class manages notifications within a single process. The NSDistributedNotificationCenter class manages notifications across multiple processes on a single computer.
显然,包含应用程序和今日扩展是不同的进程,因为当您调试今天扩展时,您想要附加包含应用程序进程,但 NSNotificationCenter 仅在单个进程中工作。
为了在包含的应用程序和扩展程序之间进行通信,您可以使用Darwin Notify Center CFNotificationCenter
工作方式类似于NSDistributedNotificationCenter
,仅适用于 osx。
想法是使用他们共享的组文件夹中的文件。在包含应用程序中,您将要发送的数据写入文件,然后发布一个 CFNotification,今天的分机将收到该通知。
在今天的扩展中,使用CFNotificationCenterAddObserver
观察CFNotification,收到它后,回调将被调用,其中一个NSNotification 必须被发布,因为回调是一个C 风格的函数和“userInfo”不能传入CFNotification,收到这个NSNotification对象后,开始从文件中读取数据,用于更新通知中心的今天扩展 View 。
您可以使用这个 github code实现强制加载今天的扩展 View 。它对我有用。
这是一篇关于此的好文章。 http://www.atomicbird.com/blog/sharing-with-app-extensions
另一种选择是使用 setHasContent 函数。当您安排本地标识符时,将 has content 设置为 false 以隐藏 View ,在 handleActionWithIdentifier
中将其设置为 true 以显示 View 。这样,当你停留在通知中心时,你暂时看不到 View ,但是当你看到它时,它就是更新的数据。
let widgetController = NCWidgetController.widgetController()
widgetController.setHasContent(false, forWidgetWithBundleIdentifier: "YourTodayWidgetBundleIdentifier")
但我认为整个问题是极少数情况,不需要修复,因为您可以通过重新加载通知中心或切换到通知标签并切换回今天标签来获取更新数据。
关于ios - NSUserDefaultsDidChangeNotification 和今天的扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28284989/
我找到了很好的函数 =GOOGLEFINANCE("AAPL";"price";TODAY(); today()-60) 可以给出指定日期范围内的股票价格 - 它工作正常。我试图用它来获取 EPS 或
基于云计算的大规模即时云渲染技术,让每个人都拥有了“数字生命”。 2023的开年爆款,非《流浪地球2》莫属。 它展开了人类的新话题,关于平行空间,关于数字生命,关于人类文明
我试图过滤掉比今天更大的日期。我查找了语法,但日期部分不起作用;我仍然在结果中得到日期 > 今天。 有人可以帮我解决这个问题吗?!谢谢!这是查询: =iferror(sort(if(isblank(S
这就是我现在所拥有的: set_time_limit(120); $now = (new \DateTime)->format('Y-m-d H:i:s'); $nowYmd = (new \Date
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: Select * from table where date = today 你好,我正在尝试做一个 mys
我使用 CouchDB 作为事件日志,我想在它之上构建简单的 UI,以便我可以更轻松地查询事件。 我可以使用原始 HTTP 调用并手动构建 View ,也可以使用 CouchApp 框架。 问题是这些
我似乎无法在“小部件模拟器”中运行“今日”小部件(或与此相关的任何扩展名)。模拟器启动,并说“无法打开小部件”以及 Failed to find Widget /Users/SomeUser/Libr
我正在使用来自此来源的日期选择器 http://jqueryui.com/datepicker/#buttonbar ,我正在尝试让按钮栏上的“今天”按钮处于事件状态,请任何人帮助我。 $(".dat
我是Prometheus和警报方面的新手,我无法通过查看文档来完善答案。 我有一些数据即将进入Elasticsearch集群。每天,该过程都会在Elasticsearch上创建一个新索引,并将当天的数
我有一个应用程序和一个今天的扩展程序,它们使用安全组标识符共享Core Data持久性存储。 主应用程序更新Core Data存储,而扩展名仅从存储中读取。 我在应用程序和扩展程序中都使用了NSFet
我在项目中完成了Today扩展的一半。 我不必向公众发布半成品,但也希望保持相同的代码库,这样可以节省代码维护时间。 没有人知道没有内置“今日”扩展程序的发布应用程序的方法吗? 谢谢 最佳答案 在应用
我花了很长时间来了解段注册的内容目的是?我已经准备好知道这来自过去 (8086)只有 1 MByte 的物理内存。但是CPU有只有 16 位宽的地址寄存器。有了这 16 个地址位你只能寻址 64K 字
我有一个表格,其中包含成员(member)加入俱乐部时输入的日期。该列是沼泽标准,类型为 DATE。不需要时间。 基本上,我正在尝试找到一种 future 不可能的方式? 最佳答案 您可以使用触发器。
我需要获取早于或等于今天的日期。我正在使用 C# LINQ。 只是想知道以下是否是最有效的方法: pr.PgDate >= DateTime.Today 最佳答案 视情况而定,假设您使用的是将其直接转
$str = 'BEGIN This is a "quote" test. \'Single\' END'; echo $str . "\n"; echo mysql_real_escape_stri
在 HTML 5 中是否支持在 Silverlight 中真正容易做到的事情? 例如,将一个文件(由用户选择)转换为一个字节数组,该字节数组可以进行 base64 编码并传递给网络服务? 或者,创建/
使用 Oracle,如何在 11:59:59 选择当前日期(即 SYSDATE)? 考虑到午夜的定义might be a little ambiguous (星期四午夜是指跨越星期四和星期五还是跨越星
My Today 扩展需要有一个基于小部件显示内容的动态高度。我能够通过在最底部元素上添加约束来实现这一点:底部布局指南的顶部小于或等于最底部元素的底部,常量为 0,优先级为 999,乘数为 1。 这
我相信你们中的许多人已经查看了今天的 (2011-02-08) Google's doodle (link to article on CNN if doodle changes)。这太棒了,我试着弄
如下所示: ? 1
我是一名优秀的程序员,十分优秀!