Загрузка PFQueryTableViewController в течение 5 минут

Я следовал этому руководству здесь https://parse.com/questions/using-pfquerytableviewcontroller-for-uitableview-sections и смог создать красивую таблицу с разделами, но она долго загружается! Ну, не навсегда, 5 минут, если быть точным. В моей таблице при разборе 587 строк, и загрузка всех объектов в разделы занимает 5 минут. Первые несколько минут отображается «Загрузка ...» в пустом представлении, затем появляется пустое табличное представление, и, наконец, загружаются все объекты. Есть ли причина, по которой что-то подобное длится так долго? Я не могу заставить своих пользователей ждать 5 минут, пока что-то загрузится. Это табличное представление отображается во время процесса регистрации. Это список школ, и новый пользователь должен выбрать, из какой они школы. Секции организуют школы в зависимости от местоположения, всего около 30 секций. Любые предложения по ускорению загрузки?

Вот код файла SchoolFinderViewController.m

#import "SchoolFinderViewController.h"

@interface SchoolFinderViewController ()

@property (nonatomic, retain) NSMutableDictionary *sections;
@property (nonatomic, retain) NSMutableDictionary *sectionToRegionMap;

@end


@implementation SchoolFinderViewController

@synthesize sections = _sections;
@synthesize sectionToRegionMap = _sectionToRegionMap;

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {

        self.parseClassName = @"School";
        self.textKey = @"Name";
        self.pullToRefreshEnabled = NO;
        self.paginationEnabled = YES;
        self.objectsPerPage = 600;
        self.sections = [NSMutableDictionary dictionary];
        self.sectionToRegionMap = [NSMutableDictionary dictionary];
    }
    return self;
}

-(void)viewDidLoad
{
    [super viewDidLoad];

    self.title = @"Schools";
}


#pragma mark - PFQueryTableViewController

- (void)objectsDidLoad:(NSError *)error {
    [super objectsDidLoad:error];

    // This method is called every time objects are loaded from Parse via the PFQuery
    NSLog(@"Count in objectsDidLoad: %lu", (unsigned long)[self.objects count]);
    [self.sections removeAllObjects];
    [self.sectionToRegionMap removeAllObjects];

    NSInteger section = 0;
    NSInteger rowIndex = 0;
    int i = 0;
    for (PFObject *object in self.objects) {
        PFObject *obj = [object objectForKey:@"region"];
        [obj fetchIfNeeded];
        NSLog(@"School %@", [object objectForKey:@"Name"]);
        NSString *Region = [obj objectForKey:@"name"];
        NSLog(@"Reg: %@", Region);
        NSMutableArray *objectsInSection = [self.sections objectForKey:Region];
        if (!objectsInSection) {
            objectsInSection = [NSMutableArray array];

            NSLog(@"Is this called? %d", i);
            // this is the first time we see this Region - increment the section index
            [self.sectionToRegionMap setObject:Region forKey:[NSNumber numberWithInt:section++]];
        }

        [objectsInSection addObject:[NSNumber numberWithInt:rowIndex++]];
        [self.sections setObject:objectsInSection forKey:Region];
    }

    NSLog(@"Finally done...");
}

- (PFQuery *)queryForTable {
    PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];

    query.cachePolicy = kPFCachePolicyCacheThenNetwork;

    // If no objects are loaded in memory, we look to the cache first to fill the table
    // and then subsequently do a query against the network.
    if (self.objects.count == 0) {
        query.cachePolicy = kPFCachePolicyCacheThenNetwork;
    }

    // Order by name
    [query orderByAscending:@"Name"];
    return query;
}

- (PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath {
    NSString *Region = [self RegionForSection:indexPath.section];
    NSArray *rowIndecesInSection = [self.sections objectForKey:Region];
    NSNumber *rowIndex = [rowIndecesInSection objectAtIndex:indexPath.row];
    return [self.objects objectAtIndex:[rowIndex intValue]];
}

#pragma mark - UITableViewDataSource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return self.sections.allKeys.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSString *Region = [self RegionForSection:section];
    NSArray *rowIndecesInSection = [self.sections objectForKey:Region];
    return rowIndecesInSection.count;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    NSString *Region = [self RegionForSection:section];
    return Region;
}


#pragma mark - UITableViewDelegate

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    NSLog(@"CellFor %ld", (long)indexPath.row);


    cell.textLabel.text = [object objectForKey:@"Name"];

    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [super tableView:tableView didSelectRowAtIndexPath:indexPath];

    PFObject *selectedObject = [self objectAtIndexPath:indexPath];
}


#pragma mark - ()

- (NSString *)RegionForSection:(NSInteger)section {
    return [self.sectionToRegionMap objectForKey:[NSNumber numberWithInt:section]];
}

person Jacob    schedule 14.07.2014    source источник
comment
Как выглядит ваш запрос?... Звучит как плохая идея, чтобы принудительно загрузить всю таблицу в начале..   -  person Fosco    schedule 15.07.2014
comment
@Fosco Я обновил вопрос своим кодом.   -  person Jacob    schedule 15.07.2014


Ответы (1)


Да, вы не сможете сделать это достаточно быстро как есть... Клиент не должен сначала загружать каждый объект, а прокрутка списков с более чем 500 элементами не очень удобна для пользователя. Возможно, у вас должен быть начальный экран, на котором они выбирают какое-то подмножество, а затем они могут запросить меньший набор данных на следующем экране. То, что вы сейчас используете в качестве раздела, может быть хорошим кандидатом.

person Fosco    schedule 14.07.2014
comment
Ладно, думаю, мне, вероятно, придется это сделать. Просто небольшой вопрос: если бы я просто запрашивал таблицу, а не помещал объекты в разделы, было бы это быстрее? - person Jacob; 15.07.2014
comment
И тогда новые объекты будут загружаться по мере прокрутки пользователем, если я уменьшу objectPerPage примерно до 25? - person Jacob; 15.07.2014
comment
они не загружаются автоматически с PFQTVC, внизу есть ячейка, они касаются, чтобы загрузить больше. - person Fosco; 15.07.2014
comment
Ооо ок. Так переопределяет ли переменная objectsPerPage свойство limit в запросе, или ограничение игнорируется, и при нажатии кнопки «Загрузить больше» запрашиваются дополнительные объекты? - person Jacob; 15.07.2014
comment
вы не должны добавлять ограничение на запрос, для этого предназначена конфигурация objectsPerPage. - person Fosco; 15.07.2014
comment
Окей, теперь я понимаю. Спасибо за вашу помощь. - person Jacob; 15.07.2014