具有Parse查询的Swift Dispatch组

时间:2015-12-14 19:26:32

标签: ios swift parse-platform grand-central-dispatch dispatch

我有4个包含Parse query.findObjectsInBackgroundWithBlock的函数。这些被调用来获取数据,然后填充表视图。使用调度组。

以下是我的解析查询的两个例子

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

我的dispatch_group_nofity

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

问题是,如果在调用dispatch_group_leave(self.group)之前足够快地检索到数据,那么它的命中和未命中会导致过早地重新加载tableview数据。我需要得到这个,以便在附加完成时调用dispatch_group_leave。

1 个答案:

答案 0 :(得分:1)

无需两种方法来检索数据,无需将数据解压缩到多个数组中,也无需使用调度组。

您只需要一种简单的方法来检索您的事件数据

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

然后,你还没有显示你的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;
}

您可以使用PFImageViewSDWebImage等框架来处理图片缓存,并在加载图片时将占位符图片放置到位。

如果您想更新活动就像

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