简体   繁体   English

具有解析查询的Swift调度组

[英]Swift Dispatch Groups with Parse queries

I have 4 functions containing Parse query.findObjectsInBackgroundWithBlock. 我有4个包含Parse query.findObjectsInBackgroundWithBlock的函数。 These are being called to grab data and then populate the table view. 这些被调用以获取数据,然后填充表视图。 Using dispatch groups. 使用调度组。

Here is two examples of my parse querys 这是我的解析查询的两个示例

func getEventImages() {
    print("getEventImages enter")
    dispatch_group_enter(self.group)

    let query = PFQuery(className: "events")
    query.orderByAscending("eventDate")
    query.findObjectsInBackgroundWithBlock { (objects:[AnyObject]!, error: NSError!) -> Void in
        // Initialize your array to contain all nil objects as
        // placeholders for your images
        if error == nil {
            self.eventMainImageArray = [UIImage?](count: objects.count, repeatedValue: nil)
            for i in 0...objects.count - 1 {

                let object: AnyObject = objects[i]
                let mainImage = object["mainImage"] as! PFFile
                //dispatch_group_enter(self.group)
                mainImage.getDataInBackgroundWithBlock({
                    (imageData: NSData!, error: NSError!) -> Void in
                    if (error == nil) {
                            let mainImage = UIImage(data:imageData)
                            self.eventMainImageArray[i] = mainImage
                            print("getEventImages appended")   
                    }
                    else {
                        print("error!!")
                    }
                })
            }
        }
        print("getEventImages leave")
        dispatch_group_leave(self.group)
    }
} 

func getEventInfo() {
    print("eventInfo enter")
    dispatch_group_enter(group)

let query = PFQuery(className: "events")
    query.orderByAscending("eventDate")
    query.findObjectsInBackgroundWithBlock { (objects:[AnyObject]!,error:   NSError!) -> Void in
        self.eventNameArray = [String?](count: objects.count, repeatedValue: nil)
        self.eventInfoArray = [String?](count: objects.count, repeatedValue: nil)
        self.eventDateArray = [NSDate?](count: objects.count, repeatedValue: nil)
        self.eventTicketsArray = [String?](count: objects.count, repeatedValue: nil)

        if error == nil {
            for i in 0...objects.count - 1 {
                let object: AnyObject = objects[i]
                let eventName = object["eventName"] as! String
                let eventInfo = object["eventInfo"] as! String
                let eventDate = object["eventDate"] as! NSDate
                let eventTicket = object["Tickets"] as! String

                self.eventNameArray[i] = eventName
                self.eventInfoArray[i] = eventInfo
                self.eventDateArray[i] = eventDate
                self.eventTicketsArray[i] = eventTicket
                print("event info appended")
            }
        }
        print("event info leave")
        dispatch_group_leave(self.group)
    }
}

And my dispatch_group_nofity 还有我的dispatch_group_nofity

 dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
        print("Finished reloadDataFromServer()")
        self.tableView.reloadData()
        self.refreshControl?.finishingLoading()
    }
}

The problem is that its hit and miss if the data gets retrieved quick enough before dispatch_group_leave(self.group) is called leading to reloading the tableview data too soon. 问题在于,如果在调用dispatch_group_leave(self.group)之前足够快地检索数据,则会造成数据丢失和丢失,从而导致过早重新加载tableview数据。 I need to get this so the dispatch_group_leave gets called when the appending is completed. 我需要获取它,以便在追加完成时调用dispatch_group_leave。

There is no need for two methods to retrieve the data, no need to unpack the data into multiple arrays and no need to use dispatch groups. 不需要两种方法来检索数据,不需要将数据解压缩为多个数组,也不需要使用调度组。

All you need is a simple method to retrieve your event data 您所需要的只是一种检索事件数据的简单方法

var events:[PFObject]=[PFObject]()

func getEventInfo() {
    let query = PFQuery(className: "events")
    query.orderByAscending("eventDate")
    query.findObjectsInBackgroundWithBlock { (objects:[AnyObject]!,error:   NSError!) -> Void in
        if error==nil {
            self.events=objects as! [PFObject]
            self.tableView.reloadData()           
        } else {
            print("Something went wrong! - \(error)"
        }
        self.refreshControl?.finishingLoading()
    }
}

Then, you haven't shown your cellForRowAtIndexPath but you would have something like 然后,您没有显示cellForRowAtIndexPath但是会看到类似

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! MyTableViewCell
    let event=self.events[indexPath.row]

    cell.eventName.text=event["eventName"] as? String
    cell.eventInfo.text=event["eventInfo"] as? String
    if let mainImageFile=event["mainImage"] as? PFFile {
        mainImageFile.getDataInBackgroundWithBlock({
            (imageData: NSData!, error: NSError!) -> Void in
            if (error == nil) {
                let mainImage = UIImage(data:imageData)
                cell.mainImage= mainImage
            }
            else {
                print("error!!")
            }
    }
    return cell;
}

You can use a PFImageView or a framework like SDWebImage to handle image caching and putting a placeholder image in place while the image is loaded. 您可以使用PFImageView或框架状SDWebImage同时加载图像处理图像缓存,并把一个图像占位符代替。

If you want to update an event is as easy as 如果您想更新事件,就像

 var event=self.events[someindex];
 event["eventName"]=newValue
 event.saveInBackground()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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