Описание: свойства и методы для получения данных из файла для карты.
#import <MapCharting/MapChartDataSource.h>
@interface MapDataSource : NSObject<MapChartDataSource> {
int m_index;
NSMutableDictionary *m_fictionalData; // Словарь данных
NSMutableArray *m_timelineTitles; // Массив подписей для временной шкалы
NSMutableArray *m_timeLineDate; // Массив дат
}
// Загружает данные из файла с указанным именем
- (id) initWithFileName:(NSString *) name;
// Определяет минимальное и максимальное значения данных
- (void) prepare;
@property (readonly,assign) double minValue; // Минимальное значение данных
@property (readonly,assign) double maxValue; // Максимальное значение данных
@end
#import "MapDataSource.h"
@implementation MapDataSource
@synthesize minValue = m_minValue;
@synthesize maxValue = m_maxValue;
// Загружает данные из файла с указанным именем
- (id)initWithFileName:(NSString *)name
{
self = [super init];
if (self) {
// Получаем путь к файлу
NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:nil];
// Читаем содержимое файла
NSString *dataString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
m_timeLineDate = [NSMutableArray new];
// Разбиваем строку с содержимым файла на подстроки, разделённые символом переноса строки
NSArray *lines = [dataString componentsSeparatedByString:@"\n"];
NSMutableArray *data = [NSMutableArray new];
for (NSString *line in lines) {
// Разбиваем кажду строку на подстроки, разделённые символом ";"
[data addObject:[line componentsSeparatedByString:@";"]];
}
m_timelineTitles = [[data objectAtIndex:0] mutableCopy];
[m_timelineTitles removeObjectAtIndex:0];
m_fictionalData = [NSMutableDictionary new];
// Заносим данные по каждой стране в словарь
for (int i = 1; i < [data count]; i++) {
NSArray *line = [data objectAtIndex:i];
NSString *key = (NSString*)[line objectAtIndex:0];
NSMutableArray *values = [NSMutableArray new];
for (int j = 1; j < [line count]; j++) {
[values addObject:[NSNumber numberWithFloat:[[line objectAtIndex:j] floatValue]] ];
}
[m_fictionalData setValue:values forKey:key];
}
}
return self;
}
// Определяет минимальное и максимальное значения данных
- (void) prepare
{
BOOL startPrepare = YES;
for (NSArray *series in [m_fictionalData allValues]) {
for (int i = 0; i < [series count]; i++) {
if(startPrepare)
{
m_minValue = [[series objectAtIndex:i] doubleValue];
m_maxValue = [[series objectAtIndex:i] doubleValue];
startPrepare = NO;
continue;
}
double val = [[series objectAtIndex:i] doubleValue];
if(m_minValue > val)
m_minValue = val;
if(m_maxValue < val)
m_maxValue = val;
}
}
}
// Возвращает массив дат
- (NSArray *) timestampArray
{
return m_timeLineDate;
}
// Возвращает массив подписей для временной шкалы
- (NSArray *) timestampTitles
{
return m_timelineTitles;
}
// Устанавливает индекс, указывающий номер значения в массиве данных по стране
- (void) setIndex:(int)index
{
m_index = index;
}
// Возвращает данные для указанной страны за текущий год их измерения
- (NSNumber *)valueWithId:(NSNumber *)objectId
{
NSArray *values = [m_fictionalData objectForKey:objectId];
if (values != nil) {
return [values objectAtIndex:m_index];
} else {
return [NSNumber numberWithInt:0];
}
}
// Возвращает данные для страны за все даты их измерения
- (NSArray *)seriesWithId:(NSNumber *)objectId
{
NSMutableArray *series = [NSMutableArray new];
series = [m_fictionalData valueForKey:[NSString stringWithFormat:@"%@", objectId]];
return series;
}
@end
См. также: