3

私のコードの目的は、サーバー ファイルとローカル ファイルの変更日を比較することです。サーバー ファイルの方が新しい場合は、それをダウンロードします。

私の最初の試みは、 http://iphoneincubator.com/blog/server-communication/how-to-download-a-file-only-if-it-has-been-updatedのコードを使用して同期要求を使用することでした

しかし、うまくいきませんでした。その後、解決策を見つけるのに苦労し、非同期リクエストを試し、stackoverflowやgoogleなどで見つけたさまざまなコードを試しましたが、何も機能しません。

ターミナルでcurl -I <url-to-file>ヘッダー値を取得すると、サーバーの問題ではないことがわかります。

これは私が今苦労しているコードです(Appdelegate.mに書かれています)

- (void)downloadFileIfUpdated {
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: url
                                                       cachePolicy: NSURLRequestReloadIgnoringLocalCacheData
                                                   timeoutInterval: 10];
[request setHTTPMethod:@"HEAD"];

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
  if(!connection) {
    NSLog(@"connection failed");
  } else {
    NSLog(@"connection succeeded");
  }
}



- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self downloadFileIfUpdated]
}



#pragma mark NSURLConnection delegate methods
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSString *lastModifiedString = nil;
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
  if ([response respondsToSelector:@selector(allHeaderFields)]) {
    lastModifiedString = [[response allHeaderFields] objectForKey:@"Last-Modified"];
  }
  [Here is where the formatting-date-code and downloading would take place]
}

今のところ、それは私にエラーを与えますNo visible @interface for 'NSURLResponse' declares de selector 'allHeaderFields'

同期アプローチを使用すると、エラーはNSLog(@"%@",lastModifiedString)(null) を返します。

PS: 自分自身またはコードを説明できるより良い方法がある場合は、お知らせください。

アップデート

私が使用している URL はタイプのものftp://であり、それが HEADERS を取得できない理由の問題である可能性があります。しかし、私はそれを行う方法を理解できません。

4

1 に答える 1

3

コードをこれに変更してください...「if」条件では、response代わりにチェックしていましたhttpResponse

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSString *lastModifiedString = nil;
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
  if ([httpResponse respondsToSelector:@selector(allHeaderFields)]) {
    lastModifiedString = [[httpResponse allHeaderFields] objectForKey:@"Last-Modified"];
  }
  // [Here is where the formatting-date-code and downloading would take place]
}

...そして、応答が常に NSHTTPURLResponse になることに慣れたら、おそらく条件ステートメントを取り除くことができます:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
  NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
  NSString *lastModifiedString = [[httpResponse allHeaderFields] objectForKey:@"Last-Modified"];
  // [Here is where the formatting-date-code and downloading would take place]
}
于 2012-11-21T23:32:18.037 に答える