文档说您需要调用 observeEventType:withBlock 来删除不再需要的观察者。
我见过在 ViewDidDisAppear 中调用它的示例。我还在 deinit 中找到了一些调用此方法的 Obj-C 代码,这在 Swift 中不是必需的。
但是,在我的简单应用程序中,只要我在应用程序中,我就希望同步数据。如果是这种情况,我是否必须调用 observeEventType:withBlock?
我查看了 Firebase 网站上的 Chat-Swift 示例代码,没有找到 observeEventType:withBlock。
这是否意味着可以不调用 observeEventType:withBlock:.如果我希望观察者在使用应用程序时打开?
谢谢。
更新
感谢 Jay 和 David。我认为在 ViewWillAppear 中观察并在 ViewDidDisappear 中删除它是有意义的。
但是,我正在使用 observeEventType 来监视节点的任何值更改,如果有任何更改,我将更新 UI。如果我把它放在 ViewWillAppear 中:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
ref.observeEventType(.Value, withBlock: { snap in {
// **update UI if there is any Value change**
})
}
将它放在 viewWillAppear 中的问题在于,无论 Value 是否更改,每次 View 出现时都会调用它。因此,每次返回 View 时都会下载快照并刷新我的 UI。这会适得其反。
我也试过 ChildAdded/ChildRemoved,但是,它只返回最后一个节点,而不是我的 ref 的路径:
例如,如果我添加到 ref/child1/child2/child3/value,ChildAdded 将只返回 child3/value。
所以如果我必须观察 Value,似乎将它放在 ViewDidLoad 中会更好?这样,它在加载 View 时获取一次快照,并在每次有变化时重复获取快照,但不会因为 View 出现而获取快照。
最佳答案
以@Jay 的出色回答为基础:
在 UIViewController 中,创建一个引用作为属性。在 viewDidLoad 中初始化一个引用。观察 viewWillAppear 中的事件。在 viewDidDisappear 中移除观察者。
class MyViewController: UIViewController {
var ref: Firebase!
// Called only on load, great place to initialize
override func viewDidLoad() {
super.viewDidLoad()
ref = Firebase(url: "https://<YOUR-FIREBASE-APP>.firebaseio.com/updates")
}
// Can be called many times to go on screen
// Syncing should only occur when on view to conserve memory
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
ref.observeEventType(.Value, withBlock: { snap in {
// do something with the data
})
}
// Can be called many times to off screen
// Remove observers on the ref to conserve memory
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
ref.removeAllObservers()
}
}
根据您的修改:
The problem with putting it in viewWillAppear is that, it gets called every time the view appears, regardless of Value change or not. Because of this, the snapshot is downloaded and my UI gets refreshed every time I return to the view. This becomes counterproductive.
Firebase 专为速度而生。这些是您留给客户端处理的事情,因为它有几个功能可以处理这些情况。
Firebase 客户端具有内置缓存。除非您在 viewDidAppear 中下载 1 兆字节的数据,否则更新是名义上的。当观察者在 viewDidAppear 上触发时,并不一定意味着它正在再次下载数据。 viewDidAppear 函数是您的观察者所在的位置。
仅供引用,我是一名在 iOS 上工作的 Firebase 员工。
关于ios - Firebase:何时快速调用 removeObserverWithHandle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31478657/
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
如何找到调用此方法的位置?defto_xml(options={})binding.pryoptions=options.to_hifoptions&&options.respond_to?(:to_h)serializable_hash(options).to_xml(options)end 最佳答案 键入caller。这将返回当前调用堆栈。文档:Kernel#caller.例子[0]%rspecspec10/16|===================================================62=====