热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS-Firebase观察单个事件调用两次

如何解决《iOS-Firebase观察单个事件调用两次》经验,应该怎么办?

我对Firebase和iOS开发相对较新,所以我希望有人能给我一些关于我做错的指导.出于某种原因,我的Observe中的代码块正在运行两次,即使ObserveSingleEvent特别应该在读取初始数据后终止观察.

我想要注意的是,这只发生在我的手机上(iPhone 7 iOS10).当我在模拟器中运行它时,我遇到了一个完全不同的问题,我得到了一个应该调用的调用,但是,当我的视图仍在上一个视图中时调用.本质上,应该在主屏幕加载其视图后调用此函数.但是,在模拟器中,当我在登录屏幕中对我的用户进行身份验证时,如果我没有用户名,则会创建弹出窗口,并且实际上不会将下一个视图显示到主屏幕.

这是引起问题的函数:

func initialSetUp() {
    print("initially set up")
    let userRef = FIRDatabase.database().reference(withPath: "/users/").child("\(uid!)")
    userRef.observeSingleEvent(of: .value, with: { (snapshot) in
        print("observing event")
        print("\(snapshot)")

        if snapshot.hasChild("username"){
           print("user has username")
        } else {
            print("user does not have username")
            //do stuff
            let nameRef = FIRDatabase.database().reference(withPath: "/usernames/")
            let alert = SCLAlertView()
            let appearance = SCLAlertView.SCLAppearance(
                kTitleFont: UIFont(name: "Futura-Medium", size: 20)!,
                kTextFont: UIFont(name: "Futura-Medium", size: 14)!,
                kButtonFont: UIFont(name: "Futura-Bold", size: 14)!,
                showCloseButton: false,
                shouldAutoDismiss: false
            )
            alert.appearance = appearance
            let newName = alert.addTextField("Enter your name")
            alert.addButton("Check name", backgroundColor: UIColor.black, textColor: UIColor.white, showDurationStatus: false) {
                UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to:nil, from:nil, for:nil)
                if let name = newName.text {
                    if name != "" {
                    //check if username is unique
                        nameRef.child(name.lowercased()).observeSingleEvent(of: FIRDataEventType.value, with: { (snapshot) in
                            print("\(snapshot.value)")
                            if !snapshot.exists() {
                                let alertView = SCLAlertView()
                                alertView.showSuccess("Woohoo!", subTitle: "This username is valid!")
                                print("valid username")
                            } else {
                                let alertView = SCLAlertView()
                                alertView.showError("Sorry :(", subTitle: "This username has already been taken.")
                            }
                        })
                    } else {
                        let alertView = SCLAlertView()
                        alertView.showError("Sorry :(", subTitle: "Your name can't be blank!")
                    }
                }

            }
            alert.addButton("Done", backgroundColor: UIColor.black, textColor: UIColor.white, showDurationStatus: false) {
                UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to:nil, from:nil, for:nil)
                if let name = newName.text {
                    if name != "" {
                        //check if username is unique
                        nameRef.child(name.lowercased()).observeSingleEvent(of: FIRDataEventType.value, with: { (snapshot) in
                            print("\(snapshot.value)")
                            if !snapshot.exists() {
                                alert.hideView()
                                let alertView = SCLAlertView()
                                alertView.showSuccess("Success!", subTitle: "You're all set to go!")
                                userRef.child("username").setValue(name)
                                nameRef.updateChildValues([name.lowercased(): self.uid])
                            } else {
                                let alertView = SCLAlertView()
                                alertView.showError("Sorry :(", subTitle: "This username has already been taken.")
                            }
                        })
                    } else {
                        let alertView = SCLAlertView()
                        alertView.showError("Sorry :(", subTitle: "Your name can't be blank!")
                    }
                }
            }
            alert.showCustom("Username", subTitle: "Please pick a user name!", color: UIColor.black, icon: SCLAlertViewStyleKit.imageOfEdit)
        }
    })
}

这是我的viewDidLoad

override func viewDidLoad() {
        self.view.addSubview(self.mapViewController.view)
        self.view.addSubview(self.tableController.view)
        print("View did load")          
        uid = (FIRAuth.auth()?.currentUser?.uid)!
        locatiOnsRef= FIRDatabase.database().reference(withPath: "/users/").child("\(uid)").child("locations")
        initialSetUp()
    }

我收到的输出看起来像这样

View did load
initially set up
observing event
user does not have username(or user does have username if I use a different account)
observing event
user does not have username(or user does have username if I use a different account)

我的Firebase数据结构:

截图

以下是打印快照时发生的情况

observing event
Snap (FJpA8PGCmwPRT9xjdrZENMIH8wJ3) {
    email = "test@gmail.com";
    id = 10207417529265514;
    name = "Jason";
}

如果需要,我很乐意提供更多信息,但我认为它可能是函数中的内容.


推荐阅读
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
author-avatar
amroc_394
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有