0

複数の画像を含む PFFile から画像を取得し、それらを 1 つのスクロールビューに配置したいと考えています。これまでのところ、次のことを試しましたが、これは「警告:メインスレッドで長時間実行されている操作が実行されています」というエラーを返します。

    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)
            }}



        }
4

2 に答える 2

1

userImageFile.getData() の代わりに userImageFile.getDataInBackgroundWithBlock() を使用してみてください

userImageFile.getData はメイン スレッドでファイルを取得します。ファイルが大きい場合やインターネット接続が遅い場合、UI がフリーズする可能性があります。

于 2015-07-11T17:16:46.087 に答える
0

エラーが発生しています:

警告: 実行時間の長い操作がメイン スレッドで実行されています。

つまり、そのタスクをメインスレッドで実行する必要があり、次のコードを使用して実行できます。

dispatch_async(dispatch_get_main_queue()) {
    //add your code here
}
于 2015-07-11T15:05:20.170 に答える