Быстрая загрузка большего количества данных повторяет уже существующую ячейку

#ios #swift #facebook #web-services #uitableview

#iOS #swift #Facebook #веб-сервисы #uitableview

Вопрос:

Я использую UITableView для загрузки данных из веб-службы. Когда загружается ячейка viewDidLoad 10, при прокрутке пользователем вниз загружается больше данных, как в приложении Facebook.

Проблема в том, что при загрузке должно быть загружено более 10 дополнительных ячеек (numberOfRowInSection должно быть равно 20), но вместо этого повторяются первые 10 ячеек, а затем появляется новостная ячейка (т. Е. numberOfRowInSection равно 30)

пример того, что происходит

viewDidLoad:

A

B

C

при загрузке большего:

A

B

C

A

B

C

D

E

F

чего я ожидаю, так это :

viewDidLoad:

A

B

C

при загрузке большего:

A

B

C

D

E

F

Я получаю данные из веб-службы в этом коде:

                     if let infoDic = result.valueForKey("Info") as? NSDictionary {
                    globalVariables.gcurrentRun = (infoDic["CurrentRun"] as! String)
                        print("currentRun: (globalVariables.gcurrentRun)")
                    globalVariables.gnextRun = (infoDic["NextRun"] as? String)!
                    if globalVariables.gcurrentRun == "1" {
                       sourceForImage = "news_icn"
                    }
                    else if globalVariables.gcurrentRun == "2" {
                       sourceForImage = "facebook_icon"
                    }
                    else if globalVariables.gcurrentRun == "3" {
                       sourceForImage = "twitter_icn"
                    }
                        print("nextRun: (globalVariables.gnextRun)")
                    currentRunForLoadMore = globalVariables.gnextRun
                    if "(infoDic["NoData"])" == 1 {
                    globalVariables.gnoData = "noMoreData"
                        print("noData: (globalVariables.gnoData)")
                    } else {
                        globalVariables.gnoData = "moreData"
                        print("noData: (globalVariables.gnoData)")
                    }
                    globalVariables.gpreviousRun = (infoDic["PreviousRun"] as? String)!
                        print("previousRun: (globalVariables.gpreviousRun)")
                    currentRunForRefresh = globalVariables.gpreviousRun
                    globalVariables.gremark = (infoDic["Remark"] as? String)!
                        print("remark: (globalVariables.gremark)")
                }

                if let mediaArray = result.valueForKey("mediaList") as? NSArray {
                    for media in mediaArray {
                        if globalVariables.gcurrentRun == "1" {
                    channel = ((media as? NSDictionary)!.valueForKey("Channel") as? String)!
                    print("channel: (channel)")
                        }
                    globalVariables.gContentOfNews = ((media as? NSDictionary)!.valueForKey("Content") as? String)!
                    print("content: (globalVariables.gContentOfNews)")
                        if globalVariables.gcurrentRun != "1" {
                            if let memberDic = (media.valueForKey("member") as? NSDictionary){
                               let memberFName = memberDic.valueForKey("Member_FName") as! String
                                channel = memberFName
                            }
                    print("fromName: (channel)")
                        }
                    globalVariables.gIdFromWeb = Int((media.valueForKey("ID") as? String)!)!
                    globalVariables.gPublishD = ((media as? NSDictionary)!.valueForKey("PublishD") as? String)!
                    print("publishD: (globalVariables.gPublishD)")
                    globalVariables.gPublishT = ((media as? NSDictionary)!.valueForKey("PublishT") as? String)!
                    print("publishTime: (globalVariables.gPublishT)")

                        newsGrouped.append(NewsGrouped(channelOfNews: channel, publishedDate: globalVariables.gPublishD, publishedTime: globalVariables.gPublishT, contentOfNews: globalVariables.gContentOfNews, remarkSourceOfNews: "(globalVariables.gTypeId)", newsIdFromWeb: globalVariables.gIdFromWeb, noDataToShow: globalVariables.gnoData))
                    do {
                        let bosId = try TeamDataHelper.insert(
                            NewsFeed(
                                newsId: 0,
                                typeId: Int(globalVariables.gcurrentRun)!,
                                idFromWeb: globalVariables.gIdFromWeb,
                                newInsertFlag: 1,
                                channel: channel,
                                fromName: globalVariables.gFromName,
                                contentOfNews: globalVariables.gContentOfNews,
                                publishD: globalVariables.gPublishD,
                                publishT: globalVariables.gPublishT
                            ))
                        print(bosId)
                    }
                }
                    completion(newsGrouped: newsGrouped)
            }
  

Здесь я использую код с функциями UITableView:

 func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    print("numberOfRows: (newsGrouped.count)")
    return self.newsGrouped.count
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return  1
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    loadActivityIndicator.stopAnimating()
   let newsCell: HPNewsWithImageTableViewCell = newsTableView.dequeueReusableCellWithIdentifier("hpNewsWithImageTableViewCell", forIndexPath: indexPath) as! HPNewsWithImageTableViewCell

        newsCell.idLbl.text = "(newsGrouped[indexPath.section].newsIdFromWeb)"
        print("newsIdFromWeb: (newsGrouped[indexPath.section].newsIdFromWeb)")
        newsCell.newsDate.text = newsGrouped[indexPath.section].publishedDate
        newsCell.userNameLbl.text = newsGrouped[indexPath.section].channelOfNews
        print("globalVariables.gChannel: (newsGrouped[indexPath.section].channelOfNews)")

        newsCell.imageOfSource.image = UIImage(named: "(newsGrouped[indexPath.section].sourceImage)")
        print("imageOfSource: (newsGrouped[indexPath.section].sourceImage)")
        newsCell.newsTime.text = newsGrouped[indexPath.section].publishedTime

        print(newsGrouped[indexPath.section].publishedTime)
        newsCell.newsText.text = newsGrouped[indexPath.section].contentOfNews
        print(newsGrouped[indexPath.section].contentOfNews)
            newsCell.selectionStyle = .None
    do {
    try TeamDataHelper.update()
        }
    catch {
    }
    return newsCell
}

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 170
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.performSegueWithIdentifier("newsDetailsSegue", sender: self)
}

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 1.5
}

func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return 5
}

func scrollViewDidScroll(scrollView: UIScrollView) {
    let offsetY = scrollView.contentOffset.y
    let contentHeight = scrollView.contentSize.height
    if offsetY > contentHeight - scrollView.frame.size.height {
        loadMoreIndicator.hidden = false
        loadMoreIndicator.startAnimating()
        CallForNewsAPICalls.GetNewsFeeds(actionDown, CurrentRun: currentRunForLoadMore) { (newsGrouped) -> Void in
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                for news in newsGrouped {
                    print("currentRunForLoadMore(currentRunForLoadMore)")
                    self.newsGrouped.append(news)
                }
                self.newsTableView.reloadData()
            })
        }

    }
}
  

обратите внимание, что я использую локальные данные

Заранее спасибо

Комментарии:

1. можете ли вы показать некоторые фрагменты кода? Я думаю, что у вас что-то не так при добавлении данных в ваш массив…

2. Каков вывод этой строки: print("numberOfRows: (newsGrouped.count)") после второго запроса?

3. при просмотре didLoad: numberOfRows: 10 когда я загружаю больше данных: numberOfRows: 30, это происходит автоматически без дополнительной загрузки numberOfRows: 60 и продолжается до тех пор, пока не достигнет numberOfRows: 4772 @MaxPevsner

4. Один из способов, который вы можете использовать, например, перед добавлением данных в массив, удалите все объекты, а затем добавьте ответ.

Ответ №1:

Похоже, что ваш сервер возвращает вам все данные.

Перед добавлением новых данных

 newsGrouped.append(NewsGrouped(channelOfNews: channel, publishedDate: globalVariables.gPublishD, publishedTime: globalVariables.gPublishT, contentOfNews: globalVariables.gContentOfNews, remarkSourceOfNews: "(globalVariables.gTypeId)", newsIdFromWeb: globalVariables.gIdFromWeb, noDataToShow: globalVariables.gnoData))
  

очистите newsGrouped массив.

Комментарии:

1. Я попробовал ваше предложение, но у меня есть пустая таблица.

2. о, я заметил кое-что, что следующие 10 ячеек после первой загрузки пропускаются вместе с остальными 10 ячейками. первая после новых 10 ячеек повторяется 3 раза

3. также данные не установлены по порядку

4. @R.AlAli поставьте точку останова в строке, упомянутой в моем ответе, и проверьте, какие значения newsGrouped имеют каждый раз, когда она попадает.

5. Спасибо, что очистка массива групп новостей — это решение

Ответ №2:

Чтобы убедиться, что вы загружаете только последнюю строку, вы можете использовать willDisplayCell . Проверьте, равна ли текущая строка общему количеству или массиву, затем начните загружать новые данные

 func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if indexPath.row == self.yourArray.count - 1 {
        // fetch your data here
    }
}
  

Ответ №3:

Вы просто сохраняете предыдущие данные в одном массиве, например, в storeArray, и когда вы загружаете другие, добавляете их в storeArray и используете sotreArray в tableview …