从swift中在uiscrollview中加载图像
问题描述:
我想从PFFile中检索包含多个图像的图像,并将它们放在一个滚动视图中。到目前为止,我已经尝试了以下操作,但是这会返回一个错误“警告:正在主线程上执行长时间运行的操作。”从swift中在uiscrollview中加载图像
let scrView = UIScrollView()
var query = PFQuery(className: "Pictures")
query.whereKey("uploader", equalTo: PFUser.currentUser()!)
query.orderByDescending("createdAt")
query.findObjectsInBackgroundWithBlock{
(posts: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
for post in posts!{
self.imageFiles.append(post["imageFile"]as! PFFile)
self.imageText.append(post["imageText"]as! String)
}
for var i = 0; i < self.pictNumber; ++i {
var userImageFile = self.imageFiles[i]
println(userImageFile)
var imgFileData = userImageFile.getData()
var image = UIImage(data: imgFileData!)
var tempImageView = UIImageView (image: image)
tempImageView.frame = CGRectMake(CGFloat(width*i), 0, self.view.frame.width, self.view.frame.height)
scrView.addSubview(tempImageView)
}
我也尝试过以下方法,但它会跳过从PFFile中提取图像并将图像添加到滚动视图的部分。
let scrView = UIScrollView()
var query = PFQuery(className: "Pictures")
query.whereKey("uploader", equalTo: PFUser.currentUser()!)
query.orderByDescending("createdAt")
query.findObjectsInBackgroundWithBlock{
(posts: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
for post in posts!{
self.imageFiles.append(post["imageFile"]as! PFFile)
self.imageText.append(post["imageText"]as! String)
}
for var i = 0; i < self.pictNumber; ++i {
var userImageFile = self.imageFiles[i]
println(userImageFile)
//Extracting pictures from PFFile
self.imageFiles[i].getDataInBackgroundWithBlock{
(imageData: NSData?, error: NSError?) -> Void in
if imageData != nil {
var image = UIImage(data: imageData!)
var tempImageView = UIImageView (image: image)
tempImageView.frame = CGRectMake(CGFloat(width*i), 0, self.view.frame.width, self.view.frame.height)
scrView.addSubview(tempImageView)
println(i)
}else {
println(error)
}}
}
答
你得到错误:
Warning: A long-running operation is being executed on the main thread.
这意味着你必须做任务到主线程,您可以通过使用此代码做到这一点:
dispatch_async(dispatch_get_main_queue()) {
//add your code here
}
答
尝试使用userImageFile .getDataInBackgroundWithBlock()代替userImageFile.getData()
userImageFile.getData获取fil e在主线程中可能会冻结您的用户界面,如果文件很大或者您的网络连接速度较慢
感谢您的输入,但同样的错误仍然会发生。 – Eri
让我看看你的代码是什么? –
dispatch_async(dispatch_get_main_queue()){ VAR imgFileData = userImageFile.getData() – Eri