2016-11-19 5 views
0

私は最初の小さなチャットアプリを作成しようとしています。ユーザーは登録時にプロフィール画像を変更することができます。ユーザーが別のユーザーとチャットするたびにプロフィール画像を表示しようとしています。すべて動作しますが、問題はいくつかの写真が極端に遅いことです。これにより、一部のメッセージは高速で表示され、他のメッセージは非常に遅く表示されます。極端に遅い画像をダウンロード

マイコード:

override func viewDidLoad() { 
    super.viewDidLoad() 

    messagesTableView.delegate = self 
    messagesTableView.dataSource = self 
    messagesTableView.clearsContextBeforeDrawing = true 

    getMessages() 
} 

    func getMessages() { 
    let ref = FIRDatabase.database().reference() 
    let messagesReference = ref.child("Messages") 

    // GETTING THE MESSAGES AND USERNAMES 
    messagesReference.observe(.childAdded, with: { (snapshot) in 

     if let dictionary = snapshot.value as? [String: AnyObject] { 

      let usernameReference = ref.child("Usernames").child(dictionary["Sender"] as! String) 

      // CONVERTING THE USERNAME INTO THE UID 
      usernameReference.observeSingleEvent(of: .value, with: { (snapshot2) in 

       if let dictionary2 = snapshot2.value as? [String: AnyObject] { 
        let uid = dictionary2["UID"] as! String 

        let uidReference = ref.child("Users").child(uid) 

        // GETTING THE PROFILE IMAGE LINK 
        uidReference.observeSingleEvent(of: .value, with: { (snapshot1) in 

         if let dictionary1 = snapshot1.value as? [String: AnyObject] { 
          let imageLink = dictionary1["Image Link"] as! String 

          // DOWNLOADING THE PROFILE IMAGE FROM THE LINK 
          let url = URL(string: imageLink) 
          URLSession.shared.dataTask(with: url!) { (data, response, error) in 

           if(error != nil){ 
            print(error as Any) 
            return 
           } 

           let profileImage = UIImage(data: data!) 

           DispatchQueue.main.async { 
            let message = Messages() 
            message.setValuesForKeys(dictionary) 
            message.profileImage = profileImage 

            self.messages.append(message) 

            self.messagesTableView.reloadData() 
           } 
          }.resume() 
         } 
        }, withCancel: nil) 
       } 
      }, withCancel: nil) 
     } 
    }, withCancel: nil) 
} 

    func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return messages.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cellId") 

    DispatchQueue.main.async { 
     let message = self.messages[indexPath.row] 
     cell.textLabel?.text = message.Sender 
     cell.detailTextLabel?.text = message.Message 
     cell.imageView?.image = message.profileImage 
    } 

    return cell 
} 

この画像はダウンロードして高速に表示している:私は「>https://firebasestorage.googleapis.com/v0/b/chat-62eba.appspot.com/o/ProfileImages%2F0B758D09-58FE-4771-BA29-16FB0EAB2FFD.png?alt=media&token=8d886b45-dd14-4157-b647-217122b6d331

- : - を >https://firebasestorage.googleapis.com/v0/b/chat-62eba.appspot.com/o/ProfileImages%2F766FB2E4-9153-4F99-81B2-14B2E3677459.png?alt=media&token=306e32e5-21b6-4ff5-918b-79c6173f0ae9

そして、この1つは非常に遅いダウンロードと表示されます解決策を見つけるために何時間も捜したが、まだ解決策を見つけていない。私は誰かが私を助けることを願っていますありがとう

+0

低速画像は11.2 MBの画像です(これとは異なり、数KBの画像)。 ...これはいつも遅いです。 アップロードできるものを最適化してください(サイズの点で)。 – entwicklerfuchs

答えて

1

あなたのコードを見るとFirebaseを使用しているので、追加のバックエンドはないと思います。問題は本当にアップロード側です。 にはが必要です。サイズを最適化し、画像をトリミングします。

func resize(image: UIImage, size: CGSize) -> UIImage? { 

    let scale = size.width/image.size.width 
    let height = image.size.height * scale 
    UIGraphicsBeginImageContext(CGSize(width: size.width, height: height)) 
    image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: height)) 

    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

    return newImage 
} 
+0

お手伝いをありがとう! –

1

2番目の画像が大きすぎます。だからこそ時間がかかります。ユーザーが最初に画像をアップロードするときは、画像のサイズを100x100または200x200まで切り取る必要があります。したがって、データベース内のすべてのプロフィール写真は同じ寸法になり、時間がかかりません。

小さな画像でも720x720 = 37kb、もう1つでは3000x2002 = 11.2Mbです。だからあなたは何が起こっているのかを見る。

あなたがアップロードしているときに画像をトリミングしたくない場合は、すべての画像のサムネイルを保存するサーバーでそれを行わなければなりません。だから、元の画像はデータベースに保存されますが、小さいサイズのサムネイルをフェッチします。しかし、それはあなたが達成しようとしているものに依存します。

+0

助けてくれてありがとう! –

関連する問題