【问题标题】:iOS Development - Associating a city with a NSTimezone OfflineiOS 开发 - 将城市与 NSTimezone Offline 关联
【发布时间】:2013-12-06 02:17:12
【问题描述】:

希望你一切顺利。

所以我正在开发一个时区 iOS 应用程序。该应用程序要求我们拥有人口众多城市的列表,并且当用户选择一个城市时,它会确定构造 NSTimeZone 对象(然后我们将其用于 NSDate 转换)所需的 Olson 时区 ID。

我已经能够获得城市列表及其对应的 lat 和 lng,我计划将其输入 Geoname 的时区服务端点,以确定每个城市的上述 Olson 时区 ID。

问题是我需要提出的请求数量巨大,我想知道是否没有更简单的解决方案来解决我的问题。任何建议/想法将不胜感激。

谢谢大家!

【问题讨论】:

    标签: ios objective-c nstimezone


    【解决方案1】:

    对于那些遇到同样问题的人,这是我最终解决问题的方法。

    我从 Geonames.org 下载了一个制表符分隔列表,其中包含一个城市列表,其中还包含每个城市的奥尔森时区 ID。您可以从 Geoname 的导出转储链接(见下文)下载一些不同的列表,但我选择了 city5000.zip 列表,以便获得一个相当全面的城市列表,而不至于过于臃肿。

    您可以在以下链接中找到下载链接和有关列表的信息: http://download.geonames.org/export/dump/readme.txt

    由于列表中包含了很多不必要的信息(例如lat和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')
    

    【讨论】:

    • 感谢脚本,非常方便 :) 我刚刚修复了缩进,看起来它没有正确复制/粘贴到 SO 中。
    【解决方案2】:

    您应该只构建一次城市/时区映射(在开发中),然后将预构建的映射提供给应用程序。然后,该应用永远不需要进行任何类型的 Internet 查找。

    您也可以将文件放在自己的服务器上,并让应用不时检查更新。

    【讨论】:

    • 我同意。如果你有一个静态的城市列表,这是最好的解决方案。城市不会更改时区,因此与此静态城市列表配对的应该是静态时区列表。
    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多