2016-04-17 15 views
1

私はMySQLデータベースでクエリを実行するための自分の迅速なフレームワークを構築しました。私は現在、チャットしている各ユーザのアバター画像を表示する必要のあるチャットアプリケーションを開発中です。関数の完了時の戻り値

私のデータベースからユーザーのプロフィール画像のURLを取得しています。プロフィール画像のURLを取得したらUIImageを返す必要があります。エラーUnexpected non-void return value in void functionが表示されます。これを簡単にするか、このエラーを回避する方法はありますか?

これは私の完全なコードです:

override func collectionView(collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageAvatarImageDataSource! { 

    let currentMessage = self.messages[indexPath.row] 

    if (currentMessage.senderId == self.senderId) { 
     // Current User sent message 

     var imageURL: NSURL! 

     ConnectionManager.sharedInstance.complexQuery("SELECT profile_picture FROM users WHERE username='\(self.senderId)' ", completion: { (result) in 
      if let results = result as? [[String: AnyObject]] { 
       for result in results { 
        if let profilePictureURL = result["profile_picture"] { 
         print(profilePictureURL) 

         imageURL = profilePictureURL as! NSURL 
         let imageData = NSData(contentsOfURL: imageURL) 
         let image = UIImage(data: imageData!) 

         // ERROR HERE (line below) 
         return JSQMessagesAvatarImageFactory.avatarImageWithImage(image, diameter: UInt(kJSQMessagesCollectionViewAvatarSizeDefault)) 
        } 
       } 
      } 
     }) 

    } else { 

     var imageURL: NSURL! 

     ConnectionManager.sharedInstance.complexQuery("SELECT profile_picture FROM users WHERE username='\(currentMessage.senderId)' ", completion: { (result) in 
      if let results = result as? [[String: AnyObject]] { 
       for result in results { 
        if let profilePictureURL = result["profile_picture"] { 
         print(profilePictureURL) 

         imageURL = profilePictureURL as! NSURL 
         let imageData = NSData(contentsOfURL: imageURL) 
         let image = UIImage(data: imageData!) 

         // ERROR HERE (line below) 
         return JSQMessagesAvatarImageFactory.avatarImageWithImage(image, diameter: UInt(kJSQMessagesCollectionViewAvatarSizeDefault)) 
        } 
       } 
      } 
     }) 

    } 
} 
+0

JSQMessagesAvatarImageFactory.avatarImageWithImage(UIImage(data:(NSData(contentsOfURL:imageURL))!)、直径:UInt(kJSQMessagesCollectionViewAvatarSizeDefault))} –

+0

上記の返品は何ですか? –

+0

@OlivierWilkinson JSQMessageViewControllerライブラリを使用して、チャットメッセージをビューコントローラに表示しています。これはJSQMessagesAvatarImage(基本的にはクエリによって返されたURLからの画像)を返します。 –

答えて

1

ConnectionManager.sharedInstance.complexQueryは非同期関数であるので、メインスレッドがそれを呼び出した後に継続する、受信するには、このコンテキストでは何も残っ存在しませんようです返されるもの 例えば、コールバック関数 "completion"の画像で何をしたいのですか? たとえば、UIImageViewの参照を取得して取得したときにその画像を設定するかもしれませんが、別のデータソースデリゲートメソッド

collectionView(_:cellForItemAtIndexPath:) 

このような何か:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    { 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier(YOUR_ID, 
           forIndexPath: indexPath) as! YourOwnCell 
     ConnectionManager.sharedInstance.complexQuery("SELECT profile_picture FROM users WHERE username='\(currentMessage.senderId)' ", completion: { (result) in 
      if let results = result as? [[String: AnyObject]] { 
       for result in results { 
        if let profilePictureURL = result["profile_picture"] { 
         print(profilePictureURL) 

         imageURL = profilePictureURL as! NSURL 
         let imageData = NSData(contentsOfURL: imageURL) 
         let image = UIImage(data: imageData!) 

         // Assuming avatarImageWithImage is returning UIImageView 
         cell.imageView = JSQMessagesAvatarImageFactory.avatarImageWithImage(image, diameter: UInt(kJSQMessagesCollectionViewAvatarSizeDefault)) 
        } 
       } 
      } 
     }) 

     return cell; 
    } 
+0

これは私がやっていることですが、コールバック関数でイメージを返さないようにしています。 –

+0

あなたのコードでコールバック関数が呼び出されていませんが、 "complexQuery"関数内のコード – AMTourky

+0

上に更新されたコードサンプルを確認してください – AMTourky

0

あなたがしようと、何が機能がどのように動作するか、非同期ではありません。どのように彼らすることができませんでした。非同期呼び出しの全体のポイントは、非同期呼び出しがバックグラウンドで実行し続けている間、アプリケーションを実行し続けることができることです。 complexQuery関数はすぐに戻り、処理を続行できます。

の代わりにの値を返すと、完了コードは値を正しい場所に置く必要があります。

+0

お返事ありがとうございます。私は代わりに 'imageURL'変数を補完コードの中に設定することによってこれを試みました。私は 'complexQuery'関数の後ろにreturn文を置いていましたが、' imageURL'がnilであるというエラーを常に得ました。私は補完するのがとても新しいので、今はばかげていると申し訳ありません。 –

+0

その理由は、非同期呼び出しが応答を待っている間、残りのコードが実行されるためです。したがって、完了時にブロックが実行される前に関数が終了します –

+0

返信いただきありがとうございます[email protected]は解決策を出しました。各ユーザーのプロフィール画像を各投稿ごとに取得するのではなく、アプリケーションが実行されたときにすぐに取得して、各投稿に追加します。チャットには2人のユーザーしかいないため、投稿が読み込まれるたびにイメージを読み込むことも効率的ではないため、これはうまく機能します。助けてくれてありがとう :) –