编译器崩溃说FIR数据库中的变量在读取所需值后意外地为零,毫秒

时间:2017-04-24 18:44:58

标签: ios swift firebase firebase-realtime-database

这里是我称之为崩溃的功能:

func retrieveOtherUserData(){
    profileRef.queryOrdered(byChild: "uid").queryEqual(toValue: "aRandomUserID6388").observe(.value, with:{
            snapshot in
            print("snapshot.value is \(snapshot.value!)")
        for item in snapshot.children {

                let profile = Profile(snapshot: item as! FIRDataSnapshot)
                otherUID = profile!.userId!
                otherUserName = profile!.firstName!
                otherUserProfilePicURLString = profile!.fbDownloadURLForMediumProfPic!
            }
        })

}

一直说当强行解开配置文件时,意外地发现了nil。以下是配置文件引用的内容:

import Foundation
import UIKit
import Firebase

class Profile: NSObject {

var userId: String!
var firstName: String!
var age: Int!
var birthday: String!
var gender: String!
var education: String!
var thisIsMyFun: String!
var iAm: String!
var location: String!
var userLat: Double!
var userLong: Double!
var firStorageNameForFB1: String!
var firStorageNameForFB2: String!
var firStorageNameForFB3: String?
var firStorageNameForFB4: String?
var firStorageNameForFB5: String?
var firStorageNameForFB6: String?
var firStorageNameForFB7: String?
var firStorageNameForFB8: String?
var firStorageNameForFB9: String?
var firStorageNameForFB10: String?
var firStorageNameForPH1: String?
var firStorageNameForPH2: String?
var fbDownloadURLForSmallProfPic: String!
var fbDownloadURLForMediumProfPic: String!
var fbDownloadURLForLargeProfPic: String!
var firDownloadURLForFB1: String!
var firDownloadURLForFB2: String!
var firDownloadURLForFB3: String?
var firDownloadURLForFB4: String?
var firDownloadURLForFB5: String?
var firDownloadURLForFB6: String?
var firDownloadURLForFB7: String?
var firDownloadURLForFB8: String?
var firDownloadURLForFB9: String?
var firDownloadURLForFB10: String?
var firDownloadURLForPH1: String?
var firDownloadURLForPH2: String?
var profileKey: String!
var profileRef: FIRDatabaseReference!

init?(snapshot: FIRDataSnapshot) {

 guard let dict = snapshot.value as? [String: Any] else { return nil }
    guard let userId = dict["uid"] else { return nil }
    guard let firstName  = dict["name"] else { return nil }
    guard let age = dict["age"] else { return nil }
    guard let birthday = dict["birthday"] else { return nil }
    guard let gender = dict["gender"] else { return nil }
    guard let education = dict["education"]  else { return nil }
    guard let thisIsMyFun  = dict["bodyOfThisIsMyFun"]  else { return nil }
    guard let iAm = dict["bodyOfIAM"] else { return nil }
    guard let location = dict["locationOfUser"] else { return nil }
    guard let userLat = dict["latitudeOfUser"] else { return nil }
    guard let userLong = dict["longitudeOfUser"] else { return nil }
    guard let firStorageNameForFB1 = dict["firStorageNameForFBPhoto1"]  else { return nil }
    guard let firStorageNameForFB2  = dict["firStorageNameForFBPhoto2"]  else { return nil }
    guard let firStorageNameForFB3 = dict["firStorageNameForFBPhoto3"] else { return nil }
    guard let firStorageNameForFB4 = dict["firStorageNameForFBPhoto4"] else { return nil }
    guard let firStorageNameForFB5 = dict["firStorageNameForFBPhoto5"] else { return nil }
    guard let firStorageNameForFB6 = dict["firStorageNameForFBPhoto6"]  else { return nil }
    guard let firStorageNameForFB7  = dict["firStorageNameForFBPhoto7"]  else { return nil }
    guard let firStorageNameForFB8 = dict["firStorageNameForFBPhoto8"] else { return nil }
    guard let firStorageNameForFB9 = dict["firStorageNameForFBPhoto9"] else { return nil }
    guard let firStorageNameForFB10 = dict["firStorageNameForFBPhoto10"] else { return nil }
    guard let firStorageNameForPH1  = dict["firStorageNameForPHPhoto1"]  else { return nil }
    guard let firStorageNameForPH2 = dict["firStorageNameForPHPhoto2"] else { return nil }
    guard let fbDownloadURLForSmallProfPic = dict["URLofSmallFBProfPic"] else { return nil }
    guard let fbDownloadURLForMediumProfPic = dict["URLofMediumFBProfPic"] else { return nil }
    guard let fbDownloadURLForLargeProfPic = dict["URLofLargeFBProfPic"]  else { return nil }
    guard let firDownloadURLForFB1  = dict["firDownloadURLStringForFBPic1"]  else { return nil }
    guard let firDownloadURLForFB2 = dict["firDownloadURLStringForFBPic2"] else { return nil }
    guard let firDownloadURLForFB3 = dict["firDownloadURLStringForFBPic3"] else { return nil }
    guard let firDownloadURLForFB4 = dict["firDownloadURLStringForFBPic4"] else { return nil }
    guard let firDownloadURLForFB5 = dict["firDownloadURLStringForFBPic5"] else { return nil }
    guard let firDownloadURLForFB6  = dict["firDownloadURLStringForFBPic6"]  else { return nil }
    guard let firDownloadURLForFB7 = dict["firDownloadURLStringForFBPic7"] else { return nil }
    guard let firDownloadURLForFB8 = dict["firDownloadURLStringForFBPic8"] else { return nil }
    guard let firDownloadURLForFB9 = dict["firDownloadURLStringForFBPic9"] else { return nil }
    guard let firDownloadURLForFB10 = dict["firDownloadURLStringForFBPic10"] else { return nil }
    guard let firDownloadURLForPH1 = dict["firDownloadURLStringForPHPic1"] else { return nil }
    guard let firDownloadURLForPH2 = dict["firDownloadURLStringForPHPic2"] else { return nil }



    self.userId = userId as! String
    self.firstName = firstName as! String
    self.age = age as! Int
    self.birthday = birthday as! String
    self.gender = gender as! String
    self.education = education as! String
    self.thisIsMyFun  = thisIsMyFun as! String
    self.iAm = iAm as! String
    self.location = location as! String
    self.userLat = userLat as! Double
    self.userLong = userLong as! Double
    self.firStorageNameForFB1 = firStorageNameForFB1 as! String
    self.firStorageNameForFB2 = firStorageNameForFB2 as! String
    self.firStorageNameForFB3 = firStorageNameForFB3 as? String
    self.firStorageNameForFB4 = firStorageNameForFB4 as? String
    self.firStorageNameForFB5 = firStorageNameForFB5 as? String
    self.firStorageNameForFB6 = firStorageNameForFB6 as? String
    self.firStorageNameForFB7 = firStorageNameForFB7 as? String
    self.firStorageNameForFB8 = firStorageNameForFB8 as? String
    self.firStorageNameForFB9 = firStorageNameForFB9 as? String
    self.firStorageNameForFB10 = firStorageNameForFB10 as? String
    self.firStorageNameForPH1 = firStorageNameForPH1 as? String
    self.firStorageNameForPH2 = firStorageNameForPH2 as? String
    self.fbDownloadURLForSmallProfPic = fbDownloadURLForSmallProfPic as! String
    self.fbDownloadURLForMediumProfPic = fbDownloadURLForMediumProfPic as! String
    self.fbDownloadURLForLargeProfPic = fbDownloadURLForLargeProfPic as! String
    self.firDownloadURLForFB1 = firDownloadURLForFB1 as! String
    self.firDownloadURLForFB2 = firDownloadURLForFB2 as! String
    self.firDownloadURLForFB3 = firDownloadURLForFB3 as? String
    self.firDownloadURLForFB4 = firDownloadURLForFB4 as? String
    self.firDownloadURLForFB5 = firDownloadURLForFB5 as? String
    self.firDownloadURLForFB6 = firDownloadURLForFB6 as? String
    self.firDownloadURLForFB7 = firDownloadURLForFB7 as? String
    self.firDownloadURLForFB8 = firDownloadURLForFB8 as? String
    self.firDownloadURLForFB9 = firDownloadURLForFB9 as? String
    self.firDownloadURLForFB10 = firDownloadURLForFB10 as? String
    self.firDownloadURLForPH1 = firDownloadURLForPH1 as? String
    self.firDownloadURLForPH2 = firDownloadURLForPH2 as? String
}

}

出于某种原因,在访问特定的过滤器组时,做同样的事情。这是一个非常相似的任务和指令的工作版本:

var filterSet:FilterSet!


override func viewDidLoad() {
    super.viewDidLoad()
    filterSetRef.queryOrdered(byChild: "uid").queryEqual(toValue:   "aRandomUserID6388").observe(.value, with:{snapshot 
        in
            print("snapshot.value is \(snapshot.value!)")
            for item in snapshot.children {

                let filterSet = FilterSet(snapshot: item as! FIRDataSnapshot)
                ageRangeFilterDeclined = filterSet!.declinedAgeRange!
                maxAgeMatch = filterSet!.maxAge!
                minAgeMatch = filterSet!.minAge!
                genderPref = filterSet!.genderPreference!
                includeFBFriendsInMatchResults = filterSet!.includeFBFriends!
                includeSportingEvents = filterSet!.sportingEvents!
                includeHiking = filterSet!.hiking!
                includeMiscellaneous = filterSet!.misc!
                includeMuseumsOrArtGalleries = filterSet!.museumsAndArtGalleries!
                includePlayMusic = filterSet!.music!
                includePlaySports = filterSet!.playingSports!
                includeStudyPartner = filterSet!.studyPartner!
                includeDancing = filterSet!.dancing!
                includeTheatre = filterSet!.theatre!
                includeConcerts = filterSet!.concerts!
                includeRunningBuddy = filterSet!.running!
                includeGames = filterSet!.games!
                maxDistanceFilterDeclined = filterSet!.maxDistanceDeclined!
                maxDistance = filterSet!.maximumDistance!
            }
        })
}

}

这里是成功填充然后引用的FilterSet类,与Profile类不同:

import UIKit
import Firebase

class FilterSet: NSObject{
    var uID: String!
    var declinedAgeRange: Bool!
    var genderPreference: String!
    var includeFBFriends: Bool!
    var sportingEvents: Bool!
    var hiking: Bool!
    var misc: Bool!
    var museumsAndArtGalleries: Bool!
    var music: Bool!
    var playingSports: Bool!
    var running: Bool!
    var studyPartner: Bool!
    var dancing: Bool!
    var theatre: Bool!
    var concerts: Bool!
    var games: Bool!
    var maxDistanceDeclined: Bool!
    var maximumDistance: Int!
    var maxAge: Int!
    var minAge: Int!
    var filterSetKey: String!
    var filterRef: FIRDatabaseReference!

init?(snapshot: FIRDataSnapshot) {
    guard let dict = snapshot.value as? [String: Any] else
      { return nil }
    guard let uID  = dict["uid"]  else { return nil }
    guard let declinedAgeRange = dict["DeclinedAgeRangeFilter"] else
      { return nil }
    guard let genderPreference = dict["GenderPreference"] else 
      { return nil }
    guard let includeFBFriends = dict["IncludeFBFriendsInMatches"] else
      { return nil }
    guard let sportingEvents  = dict["IncludeAttendSportingEvent"]  else 
       { return nil }
    guard let hiking = dict["IncludeHikingPartner"] else 
       { return nil }
    guard let misc = dict["IncludeMiscellaneous"] else
       { return nil }
    guard let museumsAndArtGalleries =   
        dict["IncludeMuseumsAndArtGalleries"] else { return nil }
    guard let music = dict["IncludePlayingMusic"] else { return nil }
    guard let playingSports = dict["IncludePlayingSports"] else 
        { return nil }
    guard let running = dict["IncludeRunningBuddy"] else
        { return nil }
    guard let studyPartner = dict["IncludeStudyPartner"] else 
        { return nil }
    guard let dancing = dict["IncludeDancing"] else { return nil }
    guard let concerts = dict["IncludeConcerts"] else { return nil }
    guard let theatre = dict["IncludeTheatre"] else { return nil }
    guard let games = dict["IncludeGames"] else { return nil }
    guard let maxDistanceDeclined  = 
         dict["MaxDistanceFilterDeclined"]  else { return nil }
    guard let maximumDistance = dict["MaxDistanceOfPostings"] else 
        { return nil }
    guard let maxAge = dict["MaximumMatchAge"] else
        { return nil }
    guard let minAge = dict["MinimumMatchAge"] else { return nil }

    self.uID = uID as! String
    self.declinedAgeRange = declinedAgeRange as! Bool
    self.genderPreference = genderPreference as! String
    self.includeFBFriends = includeFBFriends as! Bool
    self.sportingEvents = sportingEvents as! Bool
    self.hiking = hiking as! Bool
    self.misc = misc as! Bool
    self.museumsAndArtGalleries = museumsAndArtGalleries as! Bool
    self.music = music as! Bool
    self.playingSports = playingSports as! Bool
    self.running = running as! Bool
    self.studyPartner = studyPartner as! Bool
    self.dancing = dancing as! Bool
    self.concerts = concerts as! Bool
    self.theatre = theatre as! Bool
    self.games = games as! Bool
    self.maxDistanceDeclined = maxDistanceDeclined as! Bool
    self.maximumDistance = maximumDistance as! Int
    self.maxAge = maxAge as! Int
    self.minAge = minAge as! Int
}

}

我还尝试使用以下方法从FIR数据库中提取数据:

   if let dict = snapshot.value as? Dictionary<String, AnyObject> {
   otherUserName = dict["userName"], etc.

编译器告诉我所需的值存在且可读的毫秒数然后崩溃,因为它意外地发现了&#34; profile!userId!&#34;或者我首先阅读的三个简介陈述中的哪一个。 (我编辑了它在快照中说的无关值):

snapshot.value是{

"-Khh__kC9V9mnT1SAbGh" =     {

    URLofMediumFBProfPic = "https://scontent.xx.fbcdn.net/v/t1.0-1/p100x100/10665301_10204284275524944_7824974439027842885_n.jpg?oh=237544b1350b5759e963c2f5b8234f69&oe=594E1F1";
    name = Michael;
    uid = aRandomUserID6388;
};

}

我还尝试在实施3秒延迟后读取这些值,但这没有用。

我发现我的工作代码和非工作代码之间没有任何区别。我不知道如何解决这个问题。任何人都知道我的工作和非工作示例有何不同?很抱歉上面有这么多代码...

2 个答案:

答案 0 :(得分:1)

将个人资料对象更改为:

init?(snapshot: FIRDataSnapshot) {
    let dict = snapshot.value as! [String: Any]// else { return nil }
    let userId = dict["uid"] as! String// else { return nil }
    let firstName  = dict["name"] as! String //else { return nil }
    let age = dict["age"] as! Int //else { return nil }
    let birthday = dict["birthday"] as! String //else { return nil }
    let gender = dict["gender"] as! String //else { return nil }
    let education = dict["education"] as! String //else { return nil }
    let thisIsMyFun  = dict["bodyOfThisIsMyFun"] as! String // else { return nil }
    let iAm = dict["bodyOfIAM"] as! String //else { return nil }
    let location = dict["locationOfUser"] as! String //else { return nil }
    let userLat = dict["latitudeOfUser"] as! Double //else { return nil }
    let userLong = dict["longitudeOfUser"] as! Double //else { return nil }
    let firStorageNameForFB1 = dict["firStorageNameForFBPhoto1"]  as! String //else { return nil }
    let firStorageNameForFB2  = dict["firStorageNameForFBPhoto2"]  as! String //else { return nil }
    self.firStorageNameForFB3 = dict["firStorageNameForFBPhoto3"] as? String
    self.firStorageNameForFB4 = dict["firStorageNameForFBPhoto4"] as? String
    self.firStorageNameForFB5 = dict["firStorageNameForFBPhoto5"] as? String
    self.firStorageNameForFB6 = dict["firStorageNameForFBPhoto6"] as? String
    self.firStorageNameForFB7  = dict["firStorageNameForFBPhoto7"] as? String
    self.firStorageNameForFB8 = dict["firStorageNameForFBPhoto8"] as? String
    self.firStorageNameForFB9 = dict["firStorageNameForFBPhoto9"] as? String
    self.firStorageNameForFB10 = dict["firStorageNameForFBPhoto10"] as? String
    self.firStorageNameForPH1  = dict["firStorageNameForPHPhoto1"] as? String
    self.firStorageNameForPH2 = dict["firStorageNameForPHPhoto2"] as? String
    let fbDownloadURLForSmallProfPic = dict["URLofSmallFBProfPic"] as! String//else { return nil }
    let fbDownloadURLForMediumProfPic = dict["URLofMediumFBProfPic"] as! String//else { return nil }
    let fbDownloadURLForLargeProfPic = dict["URLofLargeFBProfPic"] as! String// else { return nil }
    let firDownloadURLForFB1  = dict["firDownloadURLStringForFBPic1"] as! String// else { return nil }
    let firDownloadURLForFB2 = dict["firDownloadURLStringForFBPic2"] as! String// else { return nil }
    self.firDownloadURLForFB3 = dict["firDownloadURLStringForFBPic3"] as? String
    self.firDownloadURLForFB4 = dict["firDownloadURLStringForFBPic4"] as? String
    self.firDownloadURLForFB5 = dict["firDownloadURLStringForFBPic5"] as? String
    self.firDownloadURLForFB6  = dict["firDownloadURLStringForFBPic6"] as? String
    self.firDownloadURLForFB7 = dict["firDownloadURLStringForFBPic7"] as? String
    self.firDownloadURLForFB8 = dict["firDownloadURLStringForFBPic8"] as? String
    self.firDownloadURLForFB9 = dict["firDownloadURLStringForFBPic9"] as? String
    self.firDownloadURLForFB10 = dict["firDownloadURLStringForFBPic10"] as? String
    self.firDownloadURLForPH1 = dict["firDownloadURLStringForPHPic1"] as? String
    self.firDownloadURLForPH2 = dict["firDownloadURLStringForPHPic2"] as? String
    self.activePostID1 = dict["FirstActivePostID"] as? String
    self.activePostID2 = dict["SecondActivePostID"] as? String
    self.activePostID3 = dict["ThirdActivePostID"] as? String
    self.activePostID4 = dict["FourthActivePostID"] as? String
    self.activePostID5  = dict["FifthActivePostID"] as? String
    self.activePostID6 = dict["SixthActivePostID"] as? String

    self.userId = userId as! String
    self.firstName = firstName as! String
    self.age = age as! Int
    self.birthday = birthday as! String
    self.gender = gender as! String
    self.education = education as! String
    self.thisIsMyFun  = thisIsMyFun as! String
    self.iAm = iAm as! String
    self.location = location as! String
    self.userLat = userLat as! Double
    self.userLong = userLong as! Double
    self.firStorageNameForFB1 = firStorageNameForFB1 as! String
    self.firStorageNameForFB2 = firStorageNameForFB2 as! String
    self.firStorageNameForFB3 = firStorageNameForFB3 as? String
    self.firStorageNameForFB4 = firStorageNameForFB4 as? String
    self.firStorageNameForFB5 = firStorageNameForFB5 as? String
    self.firStorageNameForFB6 = firStorageNameForFB6 as? String
    self.firStorageNameForFB7 = firStorageNameForFB7 as? String
    self.firStorageNameForFB8 = firStorageNameForFB8 as? String
    self.firStorageNameForFB9 = firStorageNameForFB9 as? String
    self.firStorageNameForFB10 = firStorageNameForFB10 as? String
    self.firStorageNameForPH1 = firStorageNameForPH1 as? String
    self.firStorageNameForPH2 = firStorageNameForPH2 as? String
    self.fbDownloadURLForSmallProfPic = fbDownloadURLForSmallProfPic as! String
    self.fbDownloadURLForMediumProfPic = fbDownloadURLForMediumProfPic as! String
    self.fbDownloadURLForLargeProfPic = fbDownloadURLForLargeProfPic as! String
    self.firDownloadURLForFB1 = firDownloadURLForFB1 as! String
    self.firDownloadURLForFB2 = firDownloadURLForFB2 as! String
    self.firDownloadURLForFB3 = firDownloadURLForFB3 as? String
    self.firDownloadURLForFB4 = firDownloadURLForFB4 as? String
    self.firDownloadURLForFB5 = firDownloadURLForFB5 as? String
    self.firDownloadURLForFB6 = firDownloadURLForFB6 as? String
    self.firDownloadURLForFB7 = firDownloadURLForFB7 as? String
    self.firDownloadURLForFB8 = firDownloadURLForFB8 as? String
    self.firDownloadURLForFB9 = firDownloadURLForFB9 as? String
    self.firDownloadURLForFB10 = firDownloadURLForFB10 as? String
    self.firDownloadURLForPH1 = firDownloadURLForPH1 as? String
    self.firDownloadURLForPH2 = firDownloadURLForPH2 as? String
    self.activePostID1 = activePostID1 as? String
    self.activePostID2 = activePostID2 as? String
    self.activePostID3 = activePostID3 as? String
    self.activePostID4 = activePostID4 as? String
    self.activePostID5 = activePostID5 as? String
    self.activePostID6 = activePostID6 as? String
}

这会导致原始崩溃函数创建可选值,强制解包时会给出所需的值。不确定为什么确切地将变量定义为可选值,因为它们被定义为非可选类型。无论如何,这在某种程度上解决了我无法提取所需值的问题。

答案 1 :(得分:0)

查看Profile的init。您期望可选值(例如firStorageNameForFB3),但您正在使用

    guard let firStorageNameForFB3 = dict["firStorageNameForFBPhoto3"] else { return nil }

所以每次firStorageNameForFB3都是零;个人资料也将是零。

尝试将模型中可选值的init更改为:

    init?(snapshot: FIRDataSnapshot) {
            // ...
            self.firStorageNameForFB3 = dict["firStorageNameForFBPhoto3"] as? String
            // ...
    }

并删除此值的guard let