1

私のアプリケーションは、起動時にローカルlist.plistファイルをロードします。

次に、私のWebサイトから.plistファイルのリモートバージョンを取得するrefreshTableボタンがあります。

App Launch
    local list.plist loads
       user hits refreshList button
          local list.plist is overwritten by remote list.plist
             local list.plist updated until remote list.plist updates again

データの初期化方法:

    //Remote data 
    list = [[NSMutableArray alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://mywebsite.com/list.plist"]];
    NSSortDescriptor *descriptor = [[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
    sortedList = [[list sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]] retain];

    //Local data
    NSString *localPath = [[NSBundle mainBundle] pathForResource:@"list" ofType:@"plist"];
   localList = [[NSMutableArray alloc] initWithContentsOfFile:localPath];
    NSSortDescriptor *localDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
    localSortedList = [[localList sortedArrayUsingDescriptors:[NSArray arrayWithObject:localDescriptor]] retain];

リフレッシュする方法は次のとおりです。

- (void) refreshTable:(id)sender

{  
   //Remote .plist 
   list = [[NSMutableArray alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://mywebsite.com/list.plist"]];
    NSSortDescriptor *descriptor = [[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
   sortedList = [[list sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]] retain];
    [self.tableView reloadData];
    //now write remote plist to local plist
}

リモート plist をダウンロードした後、ローカル plist を上書きするにはどうすればよいですか?

ローカルplistを含むローカル配列を空にして、リモート配列で埋めることを考えていましたが、次のようにしました:

私は考えた方法で解決しました:

 //Remote .plist 
    list = [[NSMutableArray alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://phillipapps.com/mntlion/list.plist"]];
    NSSortDescriptor *descriptor = [[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
    sortedList = [[list sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]] retain];

    NSLog(@"list: %@",list);
    [localList removeAllObjects];
    [localList addObjectsFromArray:list];
    localSortedList = [[localList sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]] retain];
    NSLog(@"locallist: %@",localList);
    [self.tableView reloadData];

localList動作しますが、の内容を上書きするにはどうすればよいlistですか?

4

2 に答える 2

4

だから…チャットで何時間も見た後、問題は解決しました。

- (NSArray*)readPlist
{
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *plistPath = [[documentPaths lastObject] stringByAppendingPathComponent:@"localFile.plist"];

    NSFileManager *fMgr = [NSFileManager defaultManager];
    if (![fMgr fileExistsAtPath:plistPath]) {
        plistPath = [[NSBundle mainBundle] pathForResource:@"template" ofType:@"plist"];
    }
    return [NSArray arrayWithContentsOfFile:plistPath];
}

- (void)writePlist:(NSArray*)arr
{
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *plistPath = [[documentPaths lastObject] stringByAppendingPathComponent:@"localFile.plist"];

    NSFileManager *fMgr = [NSFileManager defaultManager];
    if (![fMgr fileExistsAtPath:plistPath])
        [fMgr removeItemAtPath:plistPath error:nil];

    [arr writeToFile:plistPath atomically:YES];
}

ivar の初期化:

self.plistArray = [self readPlist];

サーバーから新しいものをロードした後、plist次のコードを呼び出す必要があります。

self.plistArray = [NSArray arrayWithContentsOfURL:[NSURL URLWithString:@"http://mywebsite.com/list.plist"]];
[self writePlist:plistArray]; // e.g. for caching
[self.tableView reloadData];
于 2012-06-10T23:41:18.190 に答える
2

私は、私のアプリケーションであなたが探していることとほとんど同じことをします。NSBundle に書き込むことはできないため、手順は次のようになります。

  1. キャッシュ ディレクトリから plist を読み込んでみてください。成功した場合は 3 に進みます。

  2. バンドルから plist をロード

  3. ロードされた plist が最新かどうかを確認します (または、ボタンを押して次のステップをトリガーします)

  4. 新しい plist をダウンロード

  5. キャッシュディレクトリに保存

コードは次のようになります。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cache = [paths objectAtIndex:0];

ratios = [NSDictionary dictionaryWithContentsOfFile:[cache stringByAppendingPathComponent:@"devices.plist"]];
if (ratios == nil) {
    ratios = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"devices" ofType:@"plist"]];
}

NSString *device = [[UIDevice currentDevice] machine];
NSDictionary *d = [ratios objectForKey:device];
if (d!=nil) {
    pixelInchRatio = [[d objectForKey:@"pixelInchRatio"] doubleValue];
    bezelWidth = [[d objectForKey:@"bezelWidth"] doubleValue];
    bezelHeight = [[d objectForKey:@"bezelHeight"] doubleValue];
} else if (fetch) {
    [[[[RulerDimensionDownload alloc] init] autorelease] startDownload];
}

次に、ダウンローダーで次のように保存します。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cache = [paths objectAtIndex:0];

[[NSFileManager defaultManager] createDirectoryAtPath:cache withIntermediateDirectories:YES attributes:nil error:nil];
[ratios writeToFile:[cache stringByAppendingPathComponent:@"devices.plist"] atomically:YES];

いくつかの説明:

各サンプルの最初の数行 (パスとキャッシュ定義) は、アプリケーションのキャッシュ ディレクトリの場所を取得するだけです。これを使用して、plist である最新バージョンを保存します。

そのため、ロード コードでは、まずキャッシュ ディレクトリから plist をロードしようとします。これが失敗した場合 (ratios が null)、アプリケーション バンドルからロードします (これは、アプリに同梱されている plist のバージョンです)。

その後、必要な情報が plist に含まれているかどうかを確認します。(plistには各デバイスタイプの定義があります。デバイスがplistにない場合、plistを更新する必要があることがわかります)

plist が古くなっている場合は、作成したクラス RulerDimensionDownload を使用してダウンロードを開始します。ダウンロードが完了したら、ファイルをキャッシュ ディレクトリに保存します。その後、次に plist をロードする必要があるときに最初にロードされ、出荷された plist は決して見られません。(新しいplistで通知も送信します)

于 2012-06-08T23:38:57.267 に答える