2016-04-17 12 views
1

Ich habe mein eigenes schnelles Framework zum Ausführen von Abfragen in einer MySQL-Datenbank erstellt. Ich entwickle gerade eine Chat-Anwendung, in der ich für jeden Benutzer, der gerade chattet, ein Avatar-Bild anzeigen muss.Rückgabewert nach Abschluss der Funktion

Ich erhalte die Profilbild-URL des Benutzers aus meiner Datenbank und dann muss ich eine UIImage zurückgeben, sobald ich die Profilbild-URL erhalte. Ich bekomme den Fehler Unexpected non-void return value in void function. Gibt es eine Möglichkeit, dies zu erleichtern oder diesen Fehler zu umgehen?

Das ist mein voller Code:

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 (Daten: (NSData (contentsOfURL: imageURL))), Durchmesser: UInt (kJSQMessagesCollectionViewAvatarSizeDefault))} –

+0

Was gibt das obige zurück? –

+0

@OlivierWilkinson Ich verwende die JSQMessageViewController-Bibliothek, um meine Chat-Nachrichten in meinem View-Controller anzuzeigen. Es gibt ein JSQMessagesAvatarImage zurück (im Grunde ein Bild aus der von der Abfrage zurückgegebenen URL). –

Antwort

1

Es scheint, dass ConnectionManager.sharedInstance.complexQuery ist eine asynchrone Funktion, so dass der Haupt-Thread nach dem Aufruf fortgesetzt wird, wird es nichts in diesem Zusammenhang links zu erhalten Was wird zurückgegeben so, was immer Sie wollen mit dem Bild in der Callback-Funktion "Vervollständigung" zum Beispiel, können Sie einen Verweis auf Ihre UIImageView bekommen und setzen Sie das Bild, wenn Sie es bekommen, aber Sie müssen ein anderes Daten verwenden Quelldelegiertenmethode

collectionView(_:cellForItemAtIndexPath:) 

Etwas wie folgt aus:

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

Das ist, was ich tue, aber es lässt mich nicht das Bild in der Rückruffunktion zurückgeben. –

+0

Die Callback-Funktion wird nicht von Ihrem Code aufgerufen, aber mit dem Code innerhalb der "complexQuery" -Funktion – AMTourky

+0

Überprüfen Sie das Codebeispiel I aktualisiert – AMTourky

0

Was Sie versuchen, ist nicht, wie asynchrone Funktionen arbeiten. Es ist nicht, wie sie könnte arbeiten. Der springende Punkt eines asynchronen Aufrufs ist, dass Ihre App weiter ausgeführt werden kann, während der asynchrone Aufruf weiterhin im Hintergrund ausgeführt wird. Ihre Funktion complexQuery wird sofort zurückgegeben, damit Sie fortfahren können.

Anstelle dieser Funktion , die den Wert zurückgibt, den Sie möchten, muss Ihr Abschlusscode den Wert an der richtigen Stelle hinterlegen.

+0

Hey, danke für die Antwort. Ich habe versucht, dies zu tun, indem ich stattdessen meine 'imageURL'-Variable innerhalb des Completion-Codes setze. Ich habe die return-Anweisung hinter der 'complexQuery'-Funktion platziert, bekomme aber immer den Fehler, dass' imageURL' gleich null ist. Ich bin ziemlich neu bei den Completions, tut mir leid, wenn ich jetzt blöd aussehe ... –

+0

Der Grund dafür ist, dass der Rest des Codes ausgeführt wird, während der asynchrone Aufruf auf eine Antwort wartet. Also die Funktion beendet, bevor der Block in Vollendung läuft –

+0

Hey danke für die Antwort [email protected] gab eine Lösung. Anstatt das Profilbild jedes Benutzers für JEDEN POST abzurufen, würde ich sie direkt beim Ausführen der Anwendung abrufen und sie dann zu jedem Beitrag hinzufügen. Dies funktioniert besser, da es nur zwei Benutzer im Chat gibt, so dass es auch ineffizient wäre, das Bild jedes Mal zu laden, wenn ein Beitrag geladen wird. Danke für die Hilfe :) –