2015-06-29 5 views
1

Я загружаю свой TableView, когда получаю данные из SDK/API от Facebook. Я хочу заполнить свой tableView этими данными, но когда я звоню self.friendsTable.reloadData(), он очень медленный и медленный, даже когда я добавил его в dispatch_async().Swift reloadData on TableView

Это 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

Загрузка данных в UIViews на cellForRow не имеет смысла находиться внутри блока отправки – Petar

+0

Можете ли вы опубликовать все свои другие методы UTIabieViewDataSource и UITableViewDelegate? Может быть, это что-то в одном из них. – Antonio

+0

Добавлено «numberOfRowsInSection» слишком – jbehrens94

ответ

3

dispatch_async в cellForRowAtIndexPath действительно не нужны - и, вероятно, это источник ваших проблем.

Этот метод вызывается внутренне при заполнении таблицы, поэтому его можно дать как само собой разумеющееся, что он выполняется в основном потоке.

Вместо этого в вашей реализации ячейка создается или удаляется, возвращается, и в дальнейшем она сконфигурирована, поскольку закрытие, переданное в dispatch_async, выполняется из потока.

Просто избавитесь от dispatch_async в cellForRowAtIndexPath, и он должен работать.

+0

Я действительно удалял это, но он по-прежнему действительно очень медленный, tableView занимает буквально секундную прокрутку. – jbehrens94

+0

медленнее во время прокрутки (это означает, что для перемещения таблицы требуется много времени), или она прокручивается нормально, но медленно обновляется информация в каждой ячейке? – Antonio

+0

Это очень медленно во время прокрутки, заставляя идти за столом. – jbehrens94

Смежные вопросы