3

我目前正在编写一个使用 XML 文档检索数据的应用程序(我使用的是 libxml2.2.7.3)。我将其设置为加载本地 XML 文件(在 xCode 的项目中,以及所有其他项目文件中)。我发现我希望能够编辑这个 XML 文件,然后对应用程序进行即时更新。我从 XML 文档中获取数据,如下所示:

NSArray *dagensRetList = [self getAllItems:@"//dagensret" fileName:@"dagensret.xml"];

我认为解决此问题的最简单方法是在我提供的网络服务器上提供该文档的新版本时下载 xml 文件(在每次应用程序启动/单击刷新按钮时,它将下载新文件来自服务器 - 也许让它检查它们是否具有相同的标签(weekNumber,它是丹麦编码的应用程序))

所以我正在考虑下载文件最方便的方法是什么,我应该保持这种获取数据的方式,还是将文档保存在服务器上更明智,然后他们每次都直接从服务器读取?(但它最终可能会使用大量流量,但它是我学校的产品,因此用户群约为 1200,但由于并非每个人都在使用智能手机,所以会更少)

您将如何从网络服务器下载文件然后将其缓存?

4

1 回答 1

5

您绝对应该将文件缓存在设备上,以防用户无法连接到服务器。

这样的事情应该让你开始:

// Create a URL Request and set the URL
NSURL *url = [NSURL URLWithString:@"http://google.com"]
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// Display the network activity indicator
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

// Perform the request on a new thread so we don't block the UI
dispatch_queue_t downloadQueue = dispatch_queue_create("Download queue", NULL);
dispatch_async(downloadQueue, ^{

    NSError* err = nil;
    NSHTTPURLResponse* rsp = nil;

    // Perform the request synchronously on this thread
    NSData *rspData = [NSURLConnection sendSynchronousRequest:request returningResponse:&rsp error:&err];

    // Once a response is received, handle it on the main thread in case we do any UI updates
    dispatch_async(dispatch_get_main_queue(), ^{
        // Hide the network activity indicator
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

        if (rspData == nil || (err != nil && [err code] != noErr)) {
            // If there was a no data received, or an error...
        } else {
            // Cache the file in the cache directory
            NSArray* paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
            NSString* path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"init.xml"];

            [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
            [data writeToFile:path atomically:YES];

            // Do whatever else you want with the data...
        }
    });
});
于 2012-07-03T17:23:24.047 回答