2015-11-01 3 views
0

Я реализую показ части сообщения, я хочу, чтобы она выполняла разбивку на страницы, я получил часть запроса. Насколько я понимаю, я задал ограниченное количество сообщений, когда пользователь достиг последнего сообщения, обновленного в tableView, запрос получает больше объектов с помощью следующего установленного предела.Укажите, когда tableView indexPath является последним

Для этого мне нужно что-то, когда tableView indexPath достигнет последнего или предыдущего.

Я искал некоторых, я думаю, что это хорошо, но я не знаю, что это значит.

Get notified when UITableView has finished asking for data?

Может кто-нибудь объяснить мне, что это значит (как это работает) и как подкласс в reloadData UITableView для этого?

fun reloadData() { 
print("begin reload") 
super.reloadData() 
print("end reload") 
} 

добавить свой код выборки, я не думаю, что это работает.

var limit = 10 
var skip = 0 
func fetchAllObjectsFromParse() { 

    //empty postArray 
    postsArray = [] 

    //bring data from parse 
    let query = PFQuery(className: "Posts") 
    query.limit = limit 

    query.orderByDescending("createdAt") 
    query.findObjectsInBackgroundWithBlock { (objects: [PFObject]?, error) -> Void in 
     if error == nil && objects != nil{ 
      for object in objects! { 

       self.postsArray.append(object) 
           } 

       if (objects!.count == self.limit){ 

        let query = PFQuery(className: "Posts") 
        self.skip += self.limit 
        query.skip = self.skip 
        query.limit = self.limit 
        print(self.limit) 
        print(self.skip) 
        query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in 
         if error == nil && objects != nil { 
          for object in objects! { 
           self.postsArray.append(object) 
           print(objects?.count) 
          } 
         } 
        }) 



        dispatch_async(dispatch_get_main_queue(),{ 
         self.tableView.reloadData() 
        }) 
       } 

     }else{ 
      print(error?.localizedDescription) 


     } 
    } 
} 
+0

Вы пытаетесь построить постраничные сети? Скорее всего, вы просто хотите знать, когда пользователь прокручивается до конца представления таблицы, чтобы вы могли загружать больше результатов (что по существу разбиение на страницы). – barndog

+0

Я делаю первый, поэтому я ищу по существу функцию разбивки на страницы. если вы объясните мне обоим, это будет лучше. Здесь я добавляю код извлечения, я не думаю, что он работает. –

ответ

0

Сначала давайте решать пагинацию. Теперь разбиение на страницы не отменяется, но для этого требуется, чтобы ваш сервер принимал страницы, чтобы он знал, какой набор результатов будет возвращен. Например, если у вас есть 100 результатов с размером группы в двадцать, в запросе вашего URL-адреса вам нужно будет указать, нужна ли вам страница 0 - 4.

Я лично рекомендовал бы использовать библиотеку с открытым исходным кодом, чтобы позаботиться о разбиении на страницы. Взгляните на MMRecord, у вас есть поддержка подкачки. Если вы чувствуете амбициозность и хотите реализовать ее самостоятельно, вам нужно будет создать некоторую сетевую услугу, лучше всего построенную на чем-то вроде AFNetworking, которая отслеживает последнюю запрашиваемую страницу.

В стрижа, который будет выглядеть примерно так:

NetworkManager.GET('http://someURI', parameters: [:], page: 0)

Как-то вы должны сохранить состояние которых страница находится рядом вокруг. Лучшим дизайном, как предложено here, является использование протоколов и своего рода оболочка источника данных, которая абстрагирует механизм от клиента.

Теперь вы также спросили, как определить, когда табличный вид прокручивается до конца, чтобы можно было отключить сетевой запрос. Один из способов сделать это - просто наблюдать scrollViewDidScroll (UITableView унаследовал от UIScrollView) и проверить, contentOffset>= self.tableView.contentSize - self.tableView.frame.size.height (что будет смещением содержимого, когда таблица полностью прокручена). Однако вы хотите, чтобы пользователь вашего приложения мог продолжать прокрутку, не прокручивая его до конца, ожидая его загрузки, а затем продолжайте прокрутку, чтобы я мог запустить запрос, когда они прокручивали 3/4 вниз по странице или даже на полпути, если вы знаете, что запрос займет много времени. Таким образом, к тому времени, когда они дойдут до сути, они уже загрузили данные, и пользователь никогда не узнает разницу.

EDIT:

Я хотел бы добавить несколько предложений для вас, кроме моего ответа. 1) Взгляните на это: http://artsy.github.io/blog/2015/09/24/mvvm-in-swift/

В нем рассказывается о шаблоне проектирования MVVM, который намного лучше удерживает состояние вместо наличия переменных состояния в вашем контроллере вида.

2) Ваша функция, fetchAllObjectsFromParse является плохим именем по нескольким причинам. Во-первых, это имя подразумевает, что функция извлекает все объекты одновременно, что не так, если вы хотите, чтобы она была разбита на страницы.

Может быть что-то вроде этого:

func fetchObjectsForModel(model: String, atPage page: Int, withBlock block: ([PFObejct], NSError?) -> Void { 

} 

А затем сделать еще одну функцию, которая будет генерировать запрос:

func generateQueryWithSkips(skip: Int, limit: Int) -> PFQuery {} 
+0

Я бы попробовал, когда пользователь достигает половины таблицыView, а затем извлекает следующие 25 данных. Я должен сделать это с помощью tmr, вы думаете, что это сложно для начинающих? –

+0

Это не невозможно, но я бы лично потратил свое время и проектировал архитектуру таким образом, чтобы все было инкапсулировано и еще много чего. Не могли бы вы принять ответ, если он сработает для вас? – barndog

+0

Конечно, спасибо! –

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