我已经构建了自己的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))
}
}
}
})
}
}
答案 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函数会立即返回,以便您可以继续。
您的完成代码必须将值存放在正确的位置,而不是此函数返回您想要的值。