TableView

时间:2015-06-29 12:36:24

标签: ios facebook swift uitableview

当我从Facebook的SDK / API接收数据时,我正在重新加载我的TableView。我想用这些数据填充我的tableView,但是当我调用self.friendsTable.reloadData()时,即使我将其添加到dispatch_async(),它也非常滞后和缓慢。

这是getFriends()中的FacebookController功能。

func getFriends(){
        let friendsReq = FBSDKGraphRequest(graphPath: "me/taggable_friends", parameters: nil)
        friendsReq.startWithCompletionHandler{
            (connection, result, error) -> Void in
            if error != nil{
                let alertCtrl = UIAlertController(title: "Geen vrienden?", message: "We konden geen vrienden vinden..", preferredStyle: .ActionSheet)
                let confirmAction = UIAlertAction(title: "Begrepen!", style: .Cancel, handler: { (action) -> Void in
                    // Do something?
                })
                alertCtrl.addAction(confirmAction)
                self.presentViewController(alertCtrl, animated: true, completion: nil)
            } else {
                let data = result["data"]
                for friend in data as! NSArray{
                    self.friendsNames.append(friend["name"] as! String)
                    self.friendsImages.append((friend["picture"]!!["data"]!!["url"] as? String)!)
                }

                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    self.tableView(self.friendsTable, numberOfRowsInSection: self.friendsNames.count)
                    self.friendsTable.reloadData()
                    return
                })

            }

        }
    }

这是cellForRowAtIndexPath()函数:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("FriendCell") as! FriendTableViewCell

        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            let img = self.friendsImages[indexPath.row]
            let imgUrl = NSURL(string: img)
            let data = NSData(contentsOfURL: imgUrl!)
            let image = UIImage(data: data!)
            cell.friendName.text = self.friendsNames[indexPath.row]
            cell.friendImage.image = image
        })

        return cell
    }

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // Do something
        return self.friendsNames.count
    }

1 个答案:

答案 0 :(得分:3)

<!DOCTYPE html> <html> <head> <title>HTML5, CSS3 and JavaScript demo</title> <script src="http://code.jquery.com/ui/1.11.4/jquery-ui.js"></script> </head> <body> <textarea id="custom-css-text">testing</textarea> </body> </html>中的dispatch_async确实不需要 - 可能这是您问题的根源。

在填充表时会在内部调用该方法,因此可以理所当然地认为它是在主线程中执行的。

而是在您的实现中,单元格被创建或出列,返回,并在稍后配置,因为传递给cellForRowAtIndexPath的闭包是在流程之外执行的。

dispatch_async中摆脱dispatch_async,它应该有用。