2

今日、私は plist サイトを読み取るアプリケーションを持っていますが、次のように動作しますか?

アプリを開くと、ユーザーがデバイスに plist を既に持っているかどうか、およびそれが最新バージョンであるかどうかがチェックされます。

あなたが持っていないかどうかは、サーバーキャッチの最新バージョンです

http://lab.vpgroup.com.br/aplicativos/teste-catalogo/lista.plist

どうすればこれを行うことができますか? ここでスタックオーバーフローに関する多くの質問を見てきましたが、必要に応じて機能するものはありませんでした。

ありがとう

4

4 に答える 4

3

UI をブロックしたくありません。ダウンロードには時間がかかる場合があります。したがって、バックグラウンドで実行します。最も簡単なのは NSURLConnection の便利なメソッドを使用するsendAsynchronousRequest:requestことです 名前が示すように、非同期であり、ダウンロードが完了すると、渡された完了ブロックを呼び出します

NSURL *url = [NSURL URLWithString:@"http://lab.vpgroup.com.br/aplicativos/teste-catalogo/lista.plist"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    NSDictionary *dict = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:0 format:0 errorDescription:nil];
    NSLog(@"%@", dict);
}]; 

サンプル:

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
    @autoreleasepool {
            NSURL *url = [NSURL URLWithString:@"http://lab.vpgroup.com.br/aplicativos/teste-catalogo/lista.plist"];
            NSURLRequest *request = [NSURLRequest requestWithURL:url];
            [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
               NSDictionary *dict = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:0 format:0 errorDescription:nil];
               NSLog(@"%@", dict);
            }]; 

            //just for demo
            [[NSRunLoop currentRunLoop] run];
    }
}
于 2013-09-30T18:42:27.267 に答える
1

デバイスに保存されている etag がサーバーが送信する etag と等しくない場合は、パスに対して HEAD 呼び出しを行い、デバイスに保存される Etag を取得してから、ファイルをダウンロードし、新しい Etag を保存して、デバイスファイル。Last-Modified: ヘッダーを使用することもできますが、おそらく etag が最適です。サーバーでエンティティ タグを有効にする必要がある場合があります。

明確にするために、HEADはファイルのヘッダーのみを送信するため、通常、比較のためにファイル全体を送信するよりもはるかに軽量です。

これは、ブラウザが静的ファイルと URL のローカル キャッシュを管理する方法です。このシナリオでは、ブラウザは Etag を送信し、ブラウザは変更されていない 304 を返します。そのため、保存された etag を送信するこのプロトコルを再現して、ブラウザにファイルまたは 304 ヘッダー。

于 2013-09-30T19:34:20.920 に答える
0

実装方法ではなく、使用できる戦略について返信しているだけです。同期または非同期は、使用されているコンテキストに依存するものです。

上記のDiaj-Djanが提案したように、NSOperationqueにリクエストを追加することをお勧めします。

あなたがそれを行う方法に答えるには:それを達成する方法がいくつかあります:

  1. オプション 1: plist ファイルにプロパティを追加できる場合は、バージョンと言って、バージョン番号を送信するサービスを公開できる場合。それ以外の場合のオプション 2. 初めて plist ファイルをダウンロードし、希望する方法でデバイスにバージョンを保存します。後続のダウンロードでは、最初にデバイスから永続化されたバージョンをチェックし、公開されたサービスからサーバーで利用可能な新しいバージョンがあるかどうかを確認します --> はいの場合 --> plist ファイルを取得するサービス呼び出しを行います --> そうでない場合デバイス内のものを使用してください。このようにして、plistをダウンロードするたびに多くの時間/データダウンロードを節約できます(特に巨大な場合)

  2. オプション 2: 毎回サービスを呼び出し、plist ファイルを取得し、プロパティを比較して、変更があるかどうかを確認します。ただし、これは良いオプションではありません。時間がかかり、多くの処理が必要です。

于 2013-09-30T19:17:55.980 に答える