Как загрузить больше данных в UITableView, используя pull для обновления или любые другие методы делегирования в swift?

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

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

P.S. Я не хочу использовать кокаоподы или какой-либо сторонний код.

Вот моя функция обновления

    // Pull to refresh
    @objc func refresh(_ refreshControl: UIRefreshControl) {
    fetchMessages(completed: {
        self.messagesTable.reloadData()
    })

    refreshControl.endRefreshing()
}

person DaveMS    schedule 23.10.2018    source источник
comment
Добро пожаловать в СО. Поделитесь, что вы уже пробовали и что не сработало. Если вы ищете кого-то, кто напишет ваш код, вы, вероятно, захотите поискать что-то еще.   -  person koen    schedule 23.10.2018
comment
Не пробовал, так как понятия не имею, что именно мне нужно делать. Я не мог найти никакой логики. Я не прошу никого писать код. Я хочу логики.   -  person DaveMS    schedule 23.10.2018
comment
@DaveMS - поиск в Google по запросу swift uitableview pull-to-refresh выдает множество учебных пособий, демонстраций, обсуждений и т. д. Вероятно, это хорошее место для начала.   -  person DonMag    schedule 23.10.2018
comment
Я не уверен, что вы просите. Вы пытаетесь получить реализацию метода fetchMessages? Если это так, то это немного сложно, не зная вашего источника данных или каких-либо деталей реализации. Есть ли причина не использовать сторонние библиотеки? Многие из них имеют почти встроенные функции чата, которые вы можете легко реализовать.   -  person GBreen12    schedule 23.10.2018
comment
Возможный дубликат Загрузка данных в UICollectionView по группам   -  person Ratul Sharker    schedule 23.10.2018
comment
Мне непонятно, о чем вы спрашиваете. Вы просите реализовать fetchMessages?   -  person David Berry    schedule 23.10.2018


Ответы (2)


На самом деле обновить в iMessage не тянет. Это называется ленивая загрузка. Ленивая загрузка означает, что у вас много данных, и вы разбиваете их на страницы. Итак, чтобы получить чат в виде таблицы с историей:

  • Разбейте базу данных чата на небольшие части, например, 10–20 сообщений в каждом фрагменте.
  • Загрузить последний фрагмент в виде таблицы.
  • В TableView...WillDisplayCellForRow... определите, когда будет отображаться первая строка табличного представления.
  • Загрузите еще один фрагмент и вставьте его вверху табличного представления.
person Mojtaba Hosseini    schedule 23.10.2018
comment
Да, вы тоже в правильном направлении, как я видел это в других ответах и ​​уроках. Что происходит с тянуть для обновления, если мы реализуем WillDisplayCellForRow? Должны ли мы удалить pull для обновления? - person DaveMS; 23.10.2018
comment
Нет необходимости вытягивать и не нужно обновлять, так как новые сообщения пришли не сверху, как в инстаграме или т. д. ;) - person Mojtaba Hosseini; 23.10.2018
comment
Я пробую этот метод, так как это лучшее, что я мог понять на данный момент, и это кажется самым простым. Что касается запроса на обновление, я оставлю его, так как хочу показывать значок загрузки, когда пользователь пытается обновить, точно так же, как в iMessages. - person DaveMS; 24.10.2018

Думайте об этом как о разбитом на страницы списке элементов. Позволяет извлекать и показывать 100 элемент за раз. В то время как пользователь запрашивает больше, вы получаете больше 100 элемента и отображаете его на странице сведений о чате.

Теперь в общей форме вы поддерживаете переменные offset и limit, которые имеют тип Int. Если вы знакомы с offset и limit API с разбивкой на страницы, вы можете пропустить следующий раздел.

Скажем, вы сначала получаете 0-100-е сообщение, в этом случае ваше offset будет 0, а limit будет 100. После завершения операции выборки ваша переменная offset будет обновлена ​​до 100. Таким образом, в следующий раз, когда вы извлекаете, вы извлекаете сообщения со 101 по 200-е и обновляете значение offset до 200. Таким образом, вы идете вперед.

Таким образом, вы должны поддерживать offset и limit. Переменная limit обозначает количество элементов, которые нужно получить за один раз.

Поэтому всякий раз, когда вы тянете, чтобы обновить табличное представление, вы извлекаете элементы в зависимости от offset и limit и заполняете элементы данных, а затем обновляете табличное представление.

Прежде всего, чтобы обновить табличное представление, просто перезагрузите табличное представление после заполнения массивов данных. Если вы хотите загружать только новые элементы в табличном представлении, посмотрите appledoc

func insertRows(at indexPaths: [IndexPath], 
       with animation: UITableView.RowAnimation)

Удачного кодирования.

person Ratul Sharker    schedule 23.10.2018
comment
Тх. Это то, что я ищу, за исключением того, что массив находится в обратном направлении, то есть я хочу загружать больше данных в верхней части экрана, когда вы тянете для обновления, как вы видите в iMessages. Итак, сначала я получаю последние сообщения (скажем, последние 100 сообщений), затем по запросу, чтобы обновить, извлекаю еще 100 более старых сообщений и так далее. Так что в моем случае я буду добавлять элементы в массив и перезагружать таблицу. Меня беспокоит то, что когда я перезагружаю таблицу после извлечения данных, она перезагружает всю (новую) таблицу? - person DaveMS; 23.10.2018
comment
После извлечения вы хотели сохранить объект msg в массиве, который используется в источнике данных tableview, поэтому перезагрузка tableview также загрузит новые элементы. - person Ratul Sharker; 23.10.2018
comment
Если вы хотите сохранить объект сообщения в локальной базе данных, используя данные кода, это совершенно другая история. Вы подключите представление таблицы к запросу coredata, чтобы всякий раз, когда результат запроса обновляется, ваше представление таблицы обновлялось автоматически. В этом случае простое сохранение объекта сообщений в основных данных автоматически синхронизирует табличное представление. - person Ratul Sharker; 23.10.2018
comment
Взгляните на ответ на этот вопрос: stackoverflow.com/questions/31870206/ Это показывает, как обновить таблицу без перезагрузки всех данных. Это более эффективно. - person GBreen12; 23.10.2018
comment
Да, это то, что я предложил во второй части. Сначала просто перезагрузите табличное представление и проверьте, все ли данные отображаются или нет. Вы можете столкнуться с некоторыми сбоями пользовательского интерфейса, такими как прокрутка таблицы вверх/вниз, для этих сбоев и оптимизации вы вставите недавно извлеченный элемент в свое представление таблицы, используя insertRows - person Ratul Sharker; 23.10.2018
comment
Я не использую локальную базу данных. Я использую веб-службу для получения фрагмента, скажем, 100 сообщений при каждом вызове. Путаница здесь. Допустим, пользователь тянет, чтобы обновить после загрузки исходных сообщений. В этом случае массив объектов будет содержать 200 сообщений (10 из начальной загрузки и следующие 100 из первого извлечения). Когда я вызываю tableview.reload, он перезагружает все 200 сообщений, как нам показать последние 100 сообщений вместо отображения целых 200 сообщений. Нам нужно прокрутить вверх, чтобы показать правильный индекс или как? - person DaveMS; 23.10.2018
comment
Да, вам нужно прокрутить до первой позиции последнего извлеченного элемента. На самом деле это зависит от вашего требования или вашего выбора, после выбора элемента, который вы хотите показать пользователю. Очевидно, вам нужно прокрутить до выбора вашего решения. - person Ratul Sharker; 23.10.2018
comment
Чтобы показать только 100 последних сообщений, верните 100 в функцию numberOfRowsInSection. - person koen; 23.10.2018