简体   繁体   中英

Fetched data from Parse not saving in Array - Swift 2.0

I am working with Parse and would like to download images for offline use. I understand that this is not possible with Local Datastore so I have decided to add them to Core Data.

I have successfully downloaded the PFFiles and put them in to an Array. I am then trying to create an Array for the NSData, but the Array count is always 0 when I use the code below

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


        }

}

从原始代码登录

If I move the Print statement up, I just get it printing every iteration of the loop.

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


        }

}

从第二个代码登录

In this case I can see that the data is added to both the imagesArray and imageDataArray.

This seems like such a simple issue but I am going crazy over it. What am I doing wrong, and is this the most efficient way of adding this data to Core Data? Am I overlooking something obvious?

I am new to programming so please do point out any mistakes I have made, and I am especially new as a questioner to stackoverflow (you have been indispensable while learning) so please let me know if you need any information that I have missed.

Thanks for your help.

Update 1

I have tried editing the code as explained in the comments and I am still getting the same result. I have moved the Print statement around on this code and it is still giving me the same results as above.

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

    }

}

Am I missing something very simple? Thanks again for your help.

Update 2

This is the same code with (I think) the print statements moved outside of the For Loop. This is giving me counts of 9,9,9,0,0 from the print statements, whereas I think I should be expecting 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")}

    }

}

There is no issue here!

You are being deceived by the way asynchronous block works. Asynchronous block gets queued up to get executed some point later in next run loop.

Your first print statement is just after you pass the code to block which is yet to be executed. Which is why you do see your image array empty.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM