【发布时间】:2015-10-05 03:03:32
【问题描述】:
您好,我希望有人可以帮助我解决这个问题。当用户首次登录我的应用程序时,会进行 API 调用,该调用将在 Web 服务器上的数据库中获取该用户的现有数据。当他们第一次登录时(如果成功),我转到另一个视图控制器,它显示一个进度指示器,当下载的数据完全保存到 Core Data 时停止动画,然后转到应用程序的主 vc(用户可以开始使用应用程序)。
我宁愿拥有一个实时指示器,而不是进度指示器,例如每次将项目保存到核心数据时都会更新的当前下载项目的计数,但在这种情况下,我别无选择,只能使用 NSNotificationCenter监听从 API 下载的每个项目何时保存到核心数据。到目前为止,我有:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(true)
NSNotificationCenter.defaultCenter().addObserver(self, selector:"contextDidSave:", name: NSManagedObjectContextDidSaveNotification, object:nil)
}
func contextDidSave(notification: NSNotification) {
if notification.name == NSManagedObjectContextDidSaveNotification {
var c = CoreMessage.getMessages(self.moc, ascending:true).count
//the println works - i see the updated count
println(c)
//this doesnt work, the lbl does not get updated
self.labelCount.text = "\(c)"
}
}
我也尝试像这样更新标签:
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.labelCount.text = "\(c)"
})
谁能解释我可能做错了什么?
【问题讨论】:
-
也许您的标签没有连接到 UI?顺便说一句 - 在每次插入后保存上下文并不高效 - 改用批处理:stackoverflow.com/questions/4145888/ios-coredata-batch-insert
-
谢谢,它通过 IB 插座连接,所以没有问题。我认为这与在单独线程上执行的工作有关,只是不确定为什么我无法访问主线程来更新标签。感谢您的批处理评论,但我将初始下载限制为 500 条记录,我分析这些记录需要不到 3 秒的时间,并且用户永远不需要再次获取那么多记录。
-
您是否尝试过检查 NSManagedObjectContext 是否在主线程上启动 - NSThread.isMainThread()
-
为什么要在 viewDidAppear 中设置观察者?
标签: ios objective-c swift core-data nsnotificationcenter