2017-02-21 21 views
0

Я хочу получить изображение, которое хранится в хранилище пользователя, и поместить его рядом с его именем в пользовательский UITableViewCell. Проблема в том, что tableview будет загружаться, когда изображения не будут загружаться (я думаю?), В результате чего приложение выйдет из строя, потому что массив изображений равен нулю. Итак, каков правильный способ загрузки таблицы? Я думаю, что для удобства пользователей важно, чтобы изображение в виде таблицы было показано, даже если изображения не были загружены, и представить им изображение по умолчанию, которое сохраняется в передачах. Я думал о создании массива с UIImages, который ссылается на объект по умолчанию для загрузки изображения и изменения изображения на изображение профиля, когда он будет загружен. Но я действительно не знаю, как это сделать. Это то, что я до сих пор о загрузке изображения:Добавление изображения из Firebase в UITableViewCell

let storage = FIRStorage.storage() 
     let storageRef = storage.reference(forURL: "link.appspot.com") 
     channelRef?.observeSingleEvent(of: .value, with: { (snapshot) in 
      if let snapDict = snapshot.value as? [String:AnyObject]{ 
       for each in snapDict{ 
        let UIDs = each.value["userID"] as? String 
        if let allUIDS = UIDs{ 
         let profilePicRef = storageRef.child((allUIDS)+"/profile_picture.png") 
         profilePicRef.data(withMaxSize: 1 * 500 * 500) { data, error in 
          if let error = error { 
          } 
          if (data != nil) 
          { 
           self.playerImages.append(UIImage (data: data!)!) 
          } 
         } 

        } 
let userNames = each.value["username"] as? String 
        if let users = userNames{ 
         self.players.append(users) 
        } 
       } 
     } 

     self.tableView.reloadData() 
    }) 

Это в cellForRow

cell.playersImage.image = playerImages[indexPath.row] as UIImage 

Мои правила, не изменили его от правил по умолчанию:

service firebase.storage { 
    match /b/omega-towers-f5beb.appspot.com/o { 
    match /{allPaths=**} { 
     allow read, write: if request.auth != null; 
    } 
    } 
} 

Спасибо.

ответ

0

После завершения загрузки изображений вы должны позвонить tableView.reloadData(). Одна важная вещь, инициализируйте ваш playerImages как playerImages = [UIImage]() вместо playerImages: [UIImage]!. если он пуст, он не покажет, что ваш массив равен нулю. Надеюсь, это поможет. Дайте мне знать, если у вас возникнут дополнительные вопросы.

UPDATE:

if let players = playerImages { 
    //code 
} 
+0

Мне жаль, что я не включил это в свой код. Я уже инициализировал playerImages, как и вы. Проблема в том, что таблица будет загружаться, когда появится представление, она не будет ждать загрузки изображений. Но опять же, я хочу проверить, содержит ли массив изображение, если нет, представление обычного изображения, которое сохраняется в активах. Я не могу использовать if playerImages! = Nil в cellForRow. – Petravd1994

+0

Я отредактировал свой ответ. Вы можете проверить нуль, просто используя if let statement. если он равен нулю, он не войдет в оператор if. Еще одна вещь, если ваш массив инициализирован и пуст, ваш numberofrowsinSection должен вернуть 0, а cellforrowat IndexPath не даст вам ошибку. –

0

Что касается пользовательского опыта, вы правы. При загрузке изображения с URL-адреса стандартное изображение имеет какой-то образ по умолчанию. Большая библиотека, используемая для кэширования изображений и использования активов по умолчанию в своем «месте», - AlamofireImage

Ответ Вандана Пателя правильный, говоря, что вам нужно убедиться, что ваш массив не равен нулю при загрузке таблицы. Вам будет предоставлен блок завершения для обработки любой дополнительной работы, которую вы хотели бы сделать с вашим изображением, используя библиотеку AlamofireImage.

Все это предполагает, что вы получаете правильный URL-адрес изображения для пользователей Firebase.

+0

Спасибо за ваш комментарий. Я вижу некоторые хорошие функции об AlamofireImage, но я обеспокоен ответом на свой вопрос. Я думаю, что мой код неправильный, поэтому добавление Alamo к моему проекту не исправило бы мой код. – Petravd1994

+0

Прошу прощения, сложно экстраполировать именно ваш вопрос. Поэтому, если бы вы могли разработать немного более кратко, то, возможно, я могу помочь. Я думал, что ваш первоначальный вопрос заключался в том, как использовать образ заполнителя вместо загружаемого изображения. – jnewkirk