3

現在、XML ドキュメントを使用してデータを取得するアプリケーションをコーディングしています (libxml2.2.7.3 を使用しています)。ローカル XML ファイルをロードするように設定しました (xCode のプロジェクトで、他のすべてのプロジェクト ファイルと一緒に)。私は、この XML ファイルを編集して、アプリケーションを即座に更新できるようにしたいと考えていました。次のように XML ドキュメントからデータをフェッチします。

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

これを回避する最も簡単な方法は、私が提供するWebサーバーからそのドキュメントの新しいバージョンが利用可能になるたびにxmlファイルをダウンロードすることだと思いました(アプリケーションを起動するたびに/更新ボタンをクリックすると、新しいファイルがダウンロードされます)サーバーから-同じタグがあるかどうかを確認させてください(weekNumber、デンマークでコード化されたアプリケーションです))

したがって、ファイルをダウンロードする最も便利な方法を考えています。データを取得するこの方法を維持する必要がありますか、それともドキュメントをサーバーに保持し、毎回サーバーから直接読み取る方が賢明でしょうか? (しかし、それは多くのトラフィックを使用することになる可能性がありますが、それは私の学校向けの製品であるため、ユーザーベースは約 1200 になりますが、誰もがスマートフォンを使用しているわけではないため、それよりも少なくなります)

Web サーバーからファイルをダウンロードして、それをキャッシュに保存するにはどうすればよいでしょうか?

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 に答える