2016-10-14 2 views
1

Ниже моя структура данных:Как сделать запрос последовательной Firebase быстрым?

{  
    "posts": { 

     "xyz1": { 
      "author": "Jan", 
      "uid": "abc123", 
     }, 
     "xyz2": { 
      "author": "Jenny", 
      "uid": "abc456", 
     }, 

     } 

    "users": { 
     "abc123": { 
      "email": "[email protected]", 
      "profilePicURL": "https://firebasestorage.googleapis.com/v0/b/", 
     }, 
     "abc456": { 
      "email": "[email protected]", 
      "profilePicURL": "https://firebasestorage.googleapis.com/v0/c/", 
     }, 
     }  
} 

Я хочу, чтобы отобразить список «сообщений» записей в Tableview.

let postRef = ref.child("posts") 

     postRef.observe(.childAdded, with: { (snapshot) in 
      let authorText = snapshot.value!.object(forKey: "author") as! String 
      let userIDText = snapshot.value!.object(forKey: "uid") as! String 
      }) { (error) in 
       print(error.localizedDescription) 
      } 

Как я могу использовать «UID» извлекается из приведенного выше запроса, чтобы сделать последовательный запрос для получения «profilePicURL» с помощью «UID» значение в «пользователей». Конечной целью является отображение profilePic, хранящегося помимо сообщения в представлении таблицы.

Благодарим за предоставленную помощь.

ответ

0

Лучшая идея состоит в том, чтобы хранить разных Пользователей в Мастере Пользователей, в которых Пользователь является Структурой.

struct User { 
    var name: String = "" 
    var id: String = "" 
} 

Затем в ViewController загрузке контента из Firebase и создать модели вашего пользователя Struct.

let users: [User] = [] 

yourFireBaseQueryFunc() { 
    ... 
    postRef.observe(.childAdded, with: { (snapshot) in 

     for item in snapshot { 

       let name = snapshot.value!.object(forKey: "author") as! String 
       let id = snapshot.value!.object(forKey: "uid") as! String 
       let user = User(name: name, id: id) 
       users.append(user) 
     } 

Тогда, например, в tableView вы берете indexPath и одну модель из вашей модели массива и вызвать функцию, чтобы получить изображение ссылку из Firebase:

cellForRowAtIndexPath... { 
    let user = users[indexPath.row] 
    let image = getImage(user.id) 
    let imgURL = NSURL(string: post.picture) 
    cell.yourImageView.sd_setImageWithURL(imgURL) 
} 

А потом Запрос изображение:

func getImage(userID: String) -> String { 

    var imageLink: String = "" 

    let ref = firebase.child("users").child(userID) 
    ref.observeEventType(.Value, withBlock: { snapshot in 

     if snapshot.exists() { 
      imageLink = snapshot.value!.valueForKey("profilePicURL") as! String 
     } 

    }) 

    return imageLink 
} 
+0

Привет, Дэвид, спасибо за ваш быстрый ответ. Однако ваш ответ действительно не решает мою проблему. –

+0

Я использовал другой метод, используя кеш для загрузки изображений. –

1
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 


    let cell = tableView.dequeueReusableCell(withIdentifier: "HomeCell", for: indexPath) as! HomeTableViewCell 

    cell.author.text = String(self.author[(indexPath as NSIndexPath).row])  
    let userIDText = String(self.userID[(indexPath as NSIndexPath).row]) 

    ref.child("users").child(userIDText).observeSingleEvent(of: .value, with: { (snapshot) in 
     print("snaphot is \(snapshot)") 
     let imageLink = snapshot.value?["profileImageUrl"] as! String 
     self.storageRef = FIRStorage.storage().reference(forURL: imageLink) 

     cell.profilePic.loadImageUsingCacheWithUrlString(urlString: imageLink) 

    }) { (error) in 
     print(error.localizedDescription) 
    } 
    return cell  
} 

Я использую следующее расширение для UIImageView, чтобы загрузить изображение с помощью т он URL, и это сработало!

let imageCache = NSCache<AnyObject, AnyObject>() 

     extension UIImageView { 

      func loadImageUsingCacheWithUrlString(urlString: String) { 

      self.image = nil 

      //check cache for image first 
      if let cachedImage = imageCache.object(forKey: urlString) as? UIImage { 
       self.image = cachedImage 
       return 
      } 

      //otherwise fire off a new download 
      let url = NSURL(string: urlString) 
      URLSession.shared.dataTask(with: url! as URL, completionHandler: { (data, response, error) in 

       //download hit an error so lets return out 
       if error != nil { 
        print(error) 
        return 
       } 

       DispatchQueue.main.async(execute: { 

        if let downloadedImage = UIImage(data: data!) { 
         imageCache.setObject(downloadedImage, forKey: urlString) 

         self.image = downloadedImage 
        } 
       }) 

      }).resume() 
     } 

    } 
Смежные вопросы