Search code examples
swiftfirebasefirebase-performance

Where to put Firebase Performance trace


I am trying to determine what the best location would be for putting a firebase Performance trace. I want to see how long it is taking my app to pull data.

In my VC I have the following

  func pullAllUsersCards() {
// 1 Start Here?
FirebaseUtility.shared.getCards { (cards, errMessage) in
  if let theCards = cards {
    if theCards.count < 1 {
      if let addVC = self.storyboard?.instantiateViewController(withIdentifier: StoryboardKeys.addCardViewControllerStoryboardID) as? AddCardViewController {
        let addNavigation = UINavigationController(rootViewController: addVC)
        if UIDevice.current.userInterfaceIdiom == .pad {
          self.splitViewController?.present(addNavigation, animated: true, completion: nil)
        } else {
          self.present(addNavigation, animated: true, completion: nil)
        }
      }
    } else {
      // 2 Start Here?
      MBProgressHUD.showAdded(to: self.view, animated: true)
      self.cardArray = theCards
      self.tableView.reloadData()
      MBProgressHUD.hide(for: self.view, animated: true)
    }
  }
 }
}

Originally I wanted to put the trace on my singleton class FirebaseUtility where the getCards method is.

  func getCards(completion: @escaping (_ cards: [Card]?, _ errorMessage: String?) -> Void) {
//    let testTrace = Performance.startTrace(name: "Test")
guard let userID = user?.uid else {
  let error = "Unknown error occured! User is not logged in."
  completion(nil, error)
  return
}

let userCardRef = ref.child(FirebaseKeys.newCards).child(userID)
userCardRef.observe(.value, with: { (snapshot) in // changed from Single Event
  let enumerator = snapshot.children
  var cards = [Card]()

  while let cardSnapshot = enumerator.nextObject() as? DataSnapshot {
    if let cardDict = cardSnapshot.value as? [String : Any] {
      let card = Card(id: cardSnapshot.key, cardDict: cardDict)
      cards.append(card)
    }
  }
  completion(cards, nil)
})
//    testTrace?.stop()
}

however when I try to use it there I get an error saying Firebase Performance does not support Extensions at this time


Solution

  • are you using Firebase Performance in the context of an App Extension (e.g. Watch, keyboard, today, etc.)? That message is triggered by this line in the FirebasePerformance.h file:

    NS_EXTENSION_UNAVAILABLE("FirebasePerformance does not support app extensions at this time.")

    Firebase Performance currently only supports normal applications on iOS.