Я занимаюсь разработкой iPhone приложение, в котором я скачиваю файл с сервера в фоновом режиме,Tableview скроллинг врезается приложение
Вот вид моего приложения,
, когда я нажимаю на
Button 1
я выборка 5 данных от сервера также изображения, после получения данных, когда пользователь прокручивается, я снова получаю новые 5 данных с сервера, когда пользователь прокручивает вверх, я получаю новые 5 данных с сервера и так далее.
при выборке данных для Button 1
если я нажимаю на Button 2
я отменяя мою предыдущую нить Button 1
и я извлечение новых данных 5 для Button 2
и прокрутки снова получении новых данных 5 То же, что кнопка 1
но через некоторое время перезагрузки TableView мое приложение получает сбои и шоу: , истекающие приложение из-за неперехваченное исключение 'NSRangeException', причина: '- [__ NSArrayM objectAtIndex]: индекс 28 за пределами [0 .. 4]
Это мой фрагмент кода:
- (void)viewDidLoad
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self fetchDataForButton1];
dispatch_async(dispatch_get_main_queue(), ^(void) {
[tableView reloadData];
});
});
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
if(it is last row then fetch new 5 data)
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//Code runs on background thread
[self LoadMoreData];
dispatch_async(dispatch_get_main_queue(), ^(void) {
//Code here is run on the main thread
[_tblList reloadData];
});
});
}else{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self beginBackgroundFetchTask];
[self downloadImage_3:indexPath];
[self endBackgroundFetchTask];
});
}
}
-(void)downloadImage_3:(NSIndexPath *)path{
UIImage *img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:ImagePath]]];
if (img) {
[dicImages_msg setObject:img forKey:[[msg_array objectAtIndex:path.row] valueForKey:@"Merchant_SmallImage"]];
}
[_tblList performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
}
- (void) beginBackgroundFetchTask
{
self.backgroundFetchTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[self endBackgroundFetchTask];
}];
}
- (void) endBackgroundFetchTask
{
[[UIApplication sharedApplication] endBackgroundTask: self.backgroundFetchTask];
self.backgroundFetchTask = UIBackgroundTaskInvalid;
NSLog(@"ended BackgroundFetchTask");
}
-(void)LoadMoreData
{
//Fetches new 5 data from server...
}
попробовать отладки приложения, поставить точку останова на cellForRowAtIndexPath. См., Когда массив выходит за пределы. Ошибка, которую вы получаете, состоит в том, что массив получает значение null для определенного indexPath.row. – z22
** Причина: [__NSArrayM objectAtIndex:]: индекс 28 за пределами границ [0 .. 4] **, вы пытаетесь получить доступ к объекту с индексом 28, но ваш массив имеет всего 5 элементов. – iNoob
Вы - правильный чувак, но когда я нажимаю на 'Button 2' я остановил выборку данных' Button 1', и я инициализирую свой массив и снова получаю новые данные для 'Button 2', но происходит сбой, потому что он все еще извлекает данные индекса' Button 1' ** 28 ** имеет «Button 1», как я должен остановить мой поток «Button 1»? при нажатии кнопки «2» – Krunal