UIRfreshControl отстает

У меня есть табличное представление, содержащее сообщения пользователей. У каждого поста есть картинка, имя пользователя и сам пост. Действие элемента управления обновлением заключается в перезагрузке таблицы данными из Parse. Все работает отлично, за исключением сильной задержки, когда я дергаю, чтобы обновить. Не знаю, из-за картинок в каждой ячейке или из-за чего-то еще. Если у кого-то есть идеи, почему это произошло, пожалуйста, дайте мне знать. Код выложу, если кому надо.

-(void)viewDidLoad {

    refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(retrieveFromParse)      forControlEvents:UIControlEventValueChanged];
refreshControl.backgroundColor = [UIColor whiteColor];
refreshControl.tintColor = [UIColor colorWithRed:0.3878 green:0.5686 blue:1.0 alpha:0.9];
[userPostsTable addSubview:refreshControl];

}


-(void) retrieveFromParse {

PFQuery *quoteQuery = [PFQuery queryWithClassName:@"Quotes"];
quoteQuery.cachePolicy = kPFCachePolicyCacheThenNetwork;
[quoteQuery orderByDescending:@"createdAt"];
[quoteQuery getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {

    if (!error) {

        NSString *category = [object objectForKey:@"Category"];

        if (category == nil) {

            quoteLabel.font = [UIFont fontWithName:@"Helvetica Neue Light Italic" size:15];

        }

        else {

            quoteLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:15];

        }

        quoteString = [object objectForKey:@"quoteContent"];
        quoteLabel.text = quoteString;

        quoteIdString = object.objectId;
        [refreshControl endRefreshing];


    }

    else {

        [refreshControl endRefreshing];
    }
}];

PFQuery *userPostsQuery = [PFQuery queryWithClassName:@"userPosts"];
userPostsQuery.cachePolicy = kPFCachePolicyCacheThenNetwork;
[userPostsQuery setLimit:300];
[userPostsQuery whereKey:@"quoteObjectId" matchesKey:@"objectId" inQuery:quoteQuery];
if (segmentedControl.selectedSegmentIndex == 0) {

    [userPostsQuery orderByDescending:@"createdAt"];

}
else {

[userPostsQuery orderByDescending:@"likeCount"];

}
[userPostsQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

    if (!error) {

        userPostsArray = [[NSArray alloc] initWithArray:objects];
        [userPostsTable reloadData];
        [refreshControl endRefreshing];

    }

    else {

        [refreshControl endRefreshing];
    }
}];


}

person bpomp87    schedule 28.12.2014    source источник
comment
Без кода ничего не могу сказать.   -  person Midhun MP    schedule 28.12.2014
comment
Вызывается ли код внутри блока завершения в основном или фоновом потоке? Это может быть проблемой, хотя я не слишком хорошо знаком с синтаксическим анализом, и в их документации не говорится, вызывается ли он в основном потоке или нет.   -  person Mike    schedule 28.12.2014


Ответы (2)


Вы извлекаете объекты в фоновом потоке.

getFirstObjectInBackgroundWithBlock:

Также вы пытаетесь обновить свой пользовательский интерфейс из фонового потока. Вам нужно обновить пользовательский интерфейс только из основного потока:

Вызовите все вызовы, связанные с пользовательским интерфейсом, например:

[userPostsTable reloadData];
[refreshControl endRefreshing];

Только из основного потока.

Использовать:

dispatch_async(dispatch_get_main_queue(), ^{
  // Update UI
});
person Midhun MP    schedule 28.12.2014
comment
Я попробовал это, и это не сделало обновление более плавным. - person bpomp87; 28.12.2014
comment
@ bpomp87: Можете ли вы удалить код из этого метода и проверить, есть ли какие-либо задержки? Также есть ли какой-либо другой код в этих методах? Вы сделали все [refreshControl endRefreshing]; внутри dispatch_async ? - person Midhun MP; 28.12.2014
comment
Если я сделаю действие элемента управления обновлением чем-то другим, кроме метода retrieveFromParse, то задержки не будет. В этих методах нет другого кода. И да, я сделал все [refreshControl endRefreshing]; внутри dispatch_async. - person bpomp87; 28.12.2014
comment
@bpomp87: Можете ли вы написать весь код в методе внутри dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ }); и сообщить мне результат? - person Midhun MP; 28.12.2014
comment
Это не решило проблему. Как вы думаете, это как-то связано с изображениями в каждой ячейке? У меня есть другое табличное представление в приложении, не содержащее изображений. Он имеет элемент управления обновлением с помощью метода retrieveFromParse. Совсем не отстает. - person bpomp87; 28.12.2014
comment
@ bpomp87: Вы не загружаете изображения, когда tableView обновляется или прокручивается, верно? Если нет, то это будет причиной. - person Midhun MP; 28.12.2014
comment
Ну, когда он обновляется, метод обновляет массив объектов из синтаксического анализа и перезагружает таблицу. Таким образом, ни один из существующих постов в таблице не меняется. Добавляются только новые (если они есть). - person bpomp87; 28.12.2014
comment
@ bpomp87: я не знаком с синтаксическим анализом, поэтому не знаю об этом. Еще одна вещь, вы обновляете всю таблицу, используя: [userPostsTable reloadData];. Также вызывайте этот метод только после [refreshControl endRefreshing];. Извините, я не смог помочь вам найти решение. - person Midhun MP; 28.12.2014

Предполагая, что ваши фрагменты кода являются частью UITableViewController, вы не должны добавлять refreshControl как subview из tableView.

-(void)viewDidLoad 
{
    refreshControl = [[UIRefreshControl alloc] init];
    [refreshControl addTarget:self action:@selector(retrieveFromParse)                  
                         forControlEvents:UIControlEventValueChanged];
    refreshControl.backgroundColor = [UIColor whiteColor];
    refreshControl.tintColor = [UIColor colorWithRed:0.3878 green:0.5686 blue:1.0 alpha:0.9];

    //This is causing the stutter
    //[userPostsTable addSubview:refreshControl];
    //UIRefreshControl is meant to be used by a UITableViewController
    self.refreshControl = refreshControl;
}
person Fruity Geek    schedule 28.12.2014
comment
Я не думаю, что это проблема. Раньше я добавлял его в другие табличные представления, и он работал нормально. - person bpomp87; 28.12.2014