当我从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
}
答案 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
,它应该有用。