【问题标题】:Fetched data from Parse not saving in Array - Swift 2.0从 Parse 获取的数据未保存在数组中 - Swift 2.0
【发布时间】:2015-10-29 04:32:25
【问题描述】:

我正在使用 Parse,并希望下载图像以供离线使用。我知道本地数据存储无法做到这一点,因此我决定将它们添加到 Core Data。

我已成功下载 PFFiles 并将它们放入一个数组中。然后我尝试为 NSData 创建一个数组,但是当我使用下面的代码时,数组计数始终为 0

class DealsDownloadViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!

var trailID = [Int]()
var trailStep = [Int]()
var dealNumber = [Int]()
var imageFile = [PFFile]()
var imagesArray = [UIImage]()
var imageDataArray = [NSData]()
var number = 0

override func viewDidLoad() {
    super.viewDidLoad()


    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

    let context: NSManagedObjectContext = appDel.managedObjectContext


    let dealsQuery = PFQuery(className: ("Deals"))
    dealsQuery.orderByAscending("TrailId")

    dealsQuery.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
        if let objects = objects {

            for object in objects {


                self.trailID.append(object["TrailID"] as! Int)
                self.trailStep.append(object["TrailStep"] as! Int)
                self.dealNumber.append(object["dealNumber"] as! Int)
                self.imageFile.append(object["dealImage"] as! PFFile!)


            }

            for file in self.imageFile {

                let dealImage = file
                dealImage.getDataInBackgroundWithBlock({ (imageData: NSData?, error: NSError?) -> Void in

                    if error == nil {

                        let image = UIImage(data: imageData!)
                        self.imageDataArray.append(imageData!)
                        self.imagesArray.append(image!)

                    } else {print("error here")}

                })

                print(self.trailID.count)
                print(self.trailStep.count)
                print(self.dealNumber.count)
                print(self.imageDataArray.count)
                print(self.imagesArray.count)
            }





        } else {print("problem making arrays")}


        }

}

如果我将 Print 语句上移,我只会让它打印循环的每次迭代。

for file in self.imageFile {

                let dealImage = file
                dealImage.getDataInBackgroundWithBlock({ (imageData: NSData?, error: NSError?) -> Void in

                    if error == nil {

                        let image = UIImage(data: imageData!)
                        self.imageDataArray.append(imageData!)
                        self.imagesArray.append(image!)

                    } else {print("error here")}

                    print(self.trailID.count)
                    print(self.trailStep.count)
                    print(self.dealNumber.count)
                    print(self.imageDataArray.count)
                    print(self.imagesArray.count)

                })


            }


        } else {print("problem making arrays")}


        }

}

在这种情况下,我可以看到数据已添加到 imagesArray 和 imageDataArray。

这似乎是一个如此简单的问题,但我要疯了。我做错了什么,这是将此数据添加到 Core Data 的最有效方法吗?我是否忽略了一些明显的东西?

我是编程新手,所以请指出我犯的任何错误,而且我作为 stackoverflow 的提问者特别新(在学习过程中你是不可或缺的)所以如果你需要任何我掌握的信息,请告诉我错过了。

感谢您的帮助。

更新 1

我已尝试按照 cmets 中的说明编辑代码,但仍然得到相同的结果。我已经在这段代码上移动了 Print 语句,它仍然给我与上面相同的结果。

for file in self.imageFile {

                let dealImage = file

                dealImage.getDataInBackgroundWithBlock({ (imageData: NSData?, error: NSError?) -> Void in

                    if error == nil {

                        weak var aBlockSelf = self

                        let image = UIImage(data: imageData!)
                        aBlockSelf!.imageDataArray.append(imageData!)
                        self.imagesArray.append(image!)

                    }

                    print(self.trailID.count)
                    print(self.trailStep.count)
                    print(self.dealNumber.count)
                    print(self.imageDataArray.count)
                    print(self.imagesArray.count)

                })

            }

        } else {print("problem making arrays")}

    }

}

我错过了一些非常简单的东西吗?再次感谢您的帮助。

更新 2

这与(我认为)将打印语句移到 For 循环之外的代码相同。这让我从打印语句中得到 9,9,9,0,0,而我认为我应该期待 9,9,9,9,9。

for file in self.imageFile {

                let dealImage = file

                dealImage.getDataInBackgroundWithBlock({ (imageData: NSData?, error: NSError?) -> Void in

                    if error == nil {

                        weak var aBlockSelf = self

                        let image = UIImage(data: imageData!)
                        aBlockSelf!.imageDataArray.append(imageData!)
                        self.imagesArray.append(image!)

                    }

                })

            }

            print(self.trailID.count)
            print(self.trailStep.count)
            print(self.dealNumber.count)
            print(self.imageDataArray.count)
            print(self.imagesArray.count)

        } else {print("problem making arrays")}

    }

}

【问题讨论】:

    标签: arrays xcode swift core-data parse-platform


    【解决方案1】:

    这里没有问题!

    您被异步块的工作方式所欺骗。异步块排队等待稍后在下一个运行循环中执行。

    您的第一个打印语句是在您将代码传递给尚未执行的块之后。这就是您看到图像数组为空的原因。

    【讨论】:

    • 非常感谢您的回复。我已经阅读了一些内容以尝试更好地理解异步块,但我无法弄清楚如何更改我的代码。我应该将打印语句移动到哪里?我已经尝试在代码周围移动它,但它似乎从来没有给出它应该得到的 9,9,9,9,9 结果。再次感谢。非常感谢您作为新手的帮助。
    • 首先,在块内部,你应该传递一个对self对象的弱引用——比如weak var aBlockSelf = self。然后将其称为aBlockSelf.imageDataArray.append(imageData!)。您应该在 imagesArray 设置在块内之后移动您的 print 语句。
    • 我似乎仍然从 print 语句中得到相同的结果。我已经更新了我的原始问题以添加您建议的更改,并且我已经在代码的那部分移动了 print 语句和 aBlockSelf 变量,但它一直给我相同的 9,9,9,0,0 或9,9,9,0,0,9,9,9,1,1...等结果。我还缺少什么吗?谢谢
    • 结果对我来说看起来不错,因为您在 for 循环中获取图像并在 for 循环中传递块,因此您的图像计数将更新 1。
    • 我想你已经破解了!非常感谢您的耐心。我知道一定有一个简单的答案。我想我需要更多的练习。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多