功能完成时的返回值

时间:2016-04-17 06:50:07

标签: ios swift completion

我已经构建了自己的swift框架,用于在MySQL数据库上运行查询。我目前正在开发一个聊天应用程序,其中我需要为当前正在聊天的每个用户显示头像图像。

我正在从我的数据库中检索用户的个人资料图片网址,然后我需要在获得个人资料图片网址后返回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))
                    }
                }
            }
        })

    }
}

2 个答案:

答案 0 :(得分:1)

似乎ConnectionManager.sharedInstance.complexQuery是一个异步函数,所以主线程在调用之后会继续,在这个上下文中将没有任何内容可以接收将要返回的内容 所以,在回调函数中完成你想要的图像"完成" 例如,您可以获得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;
    }

答案 1 :(得分:0)

您尝试的不是异步功能的工作方式。这不是他们可以工作的方式。异步调用的重点是,当异步调用继续在后台运行时,您的应用程序可以继续运行。您的complexQuery函数会立即返回,以便您可以继续。

您的完成代码必须将值存放在正确的位置,而不是此函数返回您想要的值。