Разработка iOS - ассоциирование города с автономным NSTimezone

Надеюсь, у тебя все хорошо.

Итак, я нахожусь в процессе разработки приложения iOS для часового пояса. Приложение требует, чтобы у нас был список городов с большим населением, и что, когда пользователь выбирает один из них, он определяет идентификатор часового пояса Олсона, необходимый для создания объекта NSTimeZone (который мы затем используем для преобразований NSDate).

Мне удалось получить список городов и соответствующие им широты и долготы, которые я планировал ввести в конечную точку сервиса Geoname по часовым поясам, чтобы определить вышеупомянутый идентификатор часового пояса Олсона для каждого города.

Проблема в том, что количество запросов, которые мне нужно сделать, огромно, и мне интересно, нет ли более простого решения моей проблемы. Любые предложения / идеи будут с благодарностью.

Спасибо всем!

2 ответа

Для тех, кто сталкивается с той же проблемой, вот как я в итоге решил эту проблему.

Я загрузил список с разделителями табуляции с Geonames.org, который содержал список городов, который также содержал идентификатор часового пояса Олсона для каждого города. Есть несколько разных списков, которые вы можете скачать по ссылке на дамп экспорта Geoname (см. Ниже), но я использовал список от city5000.zip, чтобы получить достаточно полный список городов, не слишком раздутый.

Вы можете найти ссылки для скачивания и информацию о списках по ссылке ниже: http://download.geonames.org/export/dump/readme.txt

Поскольку список содержал много ненужной информации (такой как координаты широты и lng), и потому что мне нужно было, чтобы данные были в формате.plist, чтобы их можно было легко использовать в приложении iOS, я написал простой скрипт на Python, который извлеките названия городов и часовые пояса из списка, отсортируйте их в алфавитном порядке на основе названий городов, а затем преобразуйте в формат.plist.

Для тех, кто заинтересован, скрипт Python выглядит следующим образом:

import json
import httplib
import os

cities = ()
rows = []
# Open up the tab delim list from Geonames.org
with open("cities15000.txt") as file:
    lines = file.readlines()

# Reading each line in the list
for line in lines:
    comps = line.split('\t')
    city = comps[1].strip()
    timezone = comps[17].strip()

    # Make sure there are no duplicates
    if not city in cities:  
        cities = cities + (city,)
        row = {'city':city,'timezone':timezone}
        rows = rows + [row,]

# Sort the rows based on the city name  
def cmp(a,b):
    if a['city'] > b['city']:
        return 1
    elif a['city'] == b['city']:
        return 0
    else:
        return -1
rows.sort(cmp)


# Convert the array to json and then to plist
jsonString = json.dumps(rows)

with open("cities.json", "w") as jsonFile:
    jsonFile.write(jsonString)
os.system('plutil -convert xml1 cities.json -o cities.plist')

Вы должны создать отображение города / часового пояса только один раз (в процессе разработки), а затем добавить в приложение предварительно построенное отображение. Тогда приложению никогда не нужно выполнять какой-либо поиск в Интернете.

Вы также можете поместить файл на свой собственный сервер и периодически проверять наличие обновлений.

Другие вопросы по тегам