Я занимаюсь обучением работе с фотографиями с Flickr. Я хочу показать самые популярные места и связанные с ними фотографии.На данный момент в приложении есть TabBarController, а каждая вкладка имеет контроллер навигации в качестве «отправной точки».Раскадровка выглядит так: [Таблица мест] -> [Таблица фотографий] -> [Прокрутка изображения] Теперь я хотел бы дать пользователю возможность переключиться на представление карты вместо представления таблицы безделаю дальнейшие шаги.
Я думаю, что лучший способ сделать это - использовать UISegmentedControl
, поэтому я использовал этот макет [ссылка на изображение] .Когда таблица видима, карта скрыта (и наоборот).
Используя только табличное представление, я использовал TableViewController.С этими изменениями я подклассифицировал UIViewController и реализовал «вручную» два протокола таблицы (delegate
и datasource
), я связал выходы, но теперь прокрутка таблицы имеет низкую частоту кадров .
Я спрашиваю flickr самое популярное место, я разделяю JSON и получаю NSArray из NSDictionary s, который я назвал «местах» (каждый словарь = место).Затем я разделил эти места по разделам по странам: список стран (в алфавитном порядке) называется 'sortedCountries'.Затем я создал NSDictionary под названием «placeByCountry» (ключ = страна / значение = массив мест для этой страны).
Вот код, который я написал:
- (NSArray*)addressForPlace:(NSDictionary*)place {
return [[place objectForKey:@"_content"] componentsSeparatedByString:@", "]; }
- (NSString *)countryForSection:(NSInteger)section {
return [self.sortedCountries objectAtIndex:section]; }
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [self countryForSection:section]; }
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [self.placesByCountry count]; }
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSString *country = [self countryForSection:section];
NSArray *placesByCountry = [self.placesByCountry objectForKey:country];
return [placesByCountry count]; }
- (UITableViewCell *)tableView:(UITableView *)tableViewLocal cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Top Place Cell";
UITableViewCell *cell = [tableViewLocal dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
// Configure the cell...
NSString *country = [self countryForSection:indexPath.section];
NSArray *placesByCountry = [self orderedPlacesForCountry:country];
NSDictionary *place = [placesByCountry objectAtIndex:indexPath.row];
NSArray *address = [self addressForPlace:place];
cell.textLabel.text = [address objectAtIndex:0];
NSMutableString *remainigAddres = [NSMutableString string];
for (NSString *s in address) {
if ([address indexOfObject:s] != 0) {
if ([address indexOfObject:s] != [address indexOfObject:[address lastObject]])
[remainigAddres appendFormat:@"%@, ", s];
else
[remainigAddres appendString:s];
}
}
cell.detailTextLabel.text = remainigAddres;
return cell; }
Это правильный подход для моей проблемы?Что я должен сделать, чтобы улучшить показатели ?Я только что проверил идентификатор ячейки, а картинки не для загрузки!Единственная асинхронная очередь происходит в начальной совокупности таблицы (когда я запрашиваю flickr) ..
РЕДАКТИРОВАТЬ: возможно, я обнаружил проблему ... прокрутка таблицы имеет низкую частоту кадров, особенно при прокрутке больших разделов .. какВы можете видеть, в tableView: cellForRowAtIndexPath: метод, я вызываю другой метод orderPlacesForCountry :.Этот метод выполняет сортировку на лету:
- (NSArray*)orderedPlacesForCountry:(NSString*)country {
NSArray* places = [self.placesByCountry objectForKey:country];
if (DEBUG_LOG_ACTIVE) NSLog(@"places: %d", [places count]);
NSMutableArray* cities = [NSMutableArray array];
for (NSDictionary* place in places) {
[cities addObject:[[self addressForPlace:place] objectAtIndex:0]];
}
if (DEBUG_LOG_ACTIVE) NSLog(@"cities: %d", [cities count]);
NSArray *sortedCities = [cities sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
if (DEBUG_LOG_ACTIVE) NSLog(@"sorted cities: %d", [sortedCities count]);
NSMutableArray *sortedPlaces = [NSMutableArray arrayWithCapacity:[places count]];
for (NSString* city in sortedCities) {
//per ogni città cerco in places quel place
for (NSDictionary* place in places) {
if ([[[self addressForPlace:place] objectAtIndex:0] isEqualToString:city])
//e lo aggiungo a sorted
[sortedPlaces addObject:place];
}
}
if (DEBUG_LOG_ACTIVE) NSLog(@"sorted places: %d", [sortedPlaces count]);
return sortedPlaces; }
Если я не сортирую места страны, прокрутка таблицы в порядке .. поэтому я попытаюсь выполнить сортировку в начале, когда данные загружаются, а не "на лету" при прокрутке.