Первое, что вы должны сделать здесь загрузить данные. Вы можете сделать это, используя NSURLConnection
. Затем вы хотите прочитать его по строкам, чтобы получить разные города. Когда вы читаете его по строкам, вы можете получить каждое отдельное поле, разделив их символом табуляции (\t
). Когда у вас есть каждое отдельное поле, не забудьте поместить их в базу данных.
Пример кода:
- (void)downloadAndParseCityList {
NSURL *listURL = [NSURL URLWithString:@"http://openweathermap.org/help/city_list.txt"];
NSURLRequest *request = [NSURLRequest requestWithURL:listURL]; //Forge the request to be used by NSURLConnection.
NSData *cityData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; //You probably use an asynchrounous request instead, but I'm too lazy to do that here.
NSString *cityString = [[NSString alloc] initWithData:cityData encoding:NSASCIIStringEncoding]; //We're going to work with the data as an NSString.
NSArray *cities = [cityString componentsSeparatedByString:@"\n"]; //By getting the components seperated by line-break, it is easier to work with each individual city more like an object.
for(NSUInteger i = 1; i <= [cities count]-1; i++) { //We start at i=1 because we don't want to parse the first line in the file ("id nm lat lon countryCode"), as these are just the field names.
NSString *cityString = cities[i];
NSArray *cityFields = [cityString componentsSeparatedByString:@"\t"]; //All the fields are seperated by a tab ('\t'), that makes it easy to read all the fields.
for(NSString *field in cityFields) {
//Here you probably want to do something with the fields. Save them to a Core Data database or something.
}
}
}
Вы должны выяснить, часть о Core Data для себя, так как я не использовал этого достаточно, чтобы быть удобным с отправлять что-либо об этом в качестве ответа.
(код не был проверен, поэтому он не может работать из коробки.)
Edit: Я извиняюсь, код не работает вообще, кажется, что данные были слишком большими для NSString
, но первая часть ответа по-прежнему применяется. Сначала проанализируйте каждый отдельный город путем разрыва строки (\n
), а затем проанализируйте каждое поле по вкладке (\t
).
EDIT 2:
код теперь работает отлично после изменения кодировки в NSASCIIStringEncoding
Ваш первый ответ был не прав, но не по той причине, вы думаете. NSString может содержать более 300 000 байт. Проблема заключалась в том, что кодирование на самом деле является «NSASCIIStringEncoding». Спасибо за ответ tho – MendyK
О, думаю, я просто слишком привык к UTF8Encoding. Тогда надеюсь, что вы получили что-то из ответа. –
Определенно полезный ответ, достойный проверки. – MendyK