サーバーからファイルを取得するために AFNetworking を使用しています。
1 つの操作を頻繁に変更する必要があります。だからここに私が言っていることについての以下のコードがあります:
- (void)downloadFileWithPath:(NSString *)urlPath withFileName:(NSString *)fileName
{
NSURL *url = [NSURL URLWithString:urlPath];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:fileName];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
// DO SOMETHING HERE
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
[operation start];
}
だから、私が必要なもの。最初に、xml ファイルをダウンロードして Documents ディレクトリに保存する必要があります (私はそれを行いました。これを作成する方法を説明する必要はありません)。ここで、次のコードを呼び出します。
[object downloadFileWithPath:urlPath withFileName:fileName]
xml ファイルがロードされた後、同じ方法を使用して次のダウンロードを呼び出す必要がありますが、この場合は、たとえば別のファイル .zip に対してです。これは、xml ファイルがいつロードされるか (この場合は setCompletionBlockWithSuccess) を把握し、ダウンロード .zip ファイルを実行する必要があることを意味します。
上記のコードに // DO SOMETHING HERE というコメントを追加しました。毎回異なる操作を行う必要があるため、zip ファイルの xml ファイルに対する異なる要求に対して、ここでいくつかのセレクターを実行する必要があると思います。そのため、xmlファイルパーサーをロードした後、zipファイルのURLを取得して再度ダウンロードを行うように見えますが、この場合は同じ方法を使用してzipファイルをダウンロードします。
もちろん、たとえば2つの異なるメソッドを作成できます
- (void)downloadXMLFileWithPath:(NSString *)urlPath withFileName:(NSString *)fileName;
- (void)downloadZIPFileWithPath:(NSString *)urlPath withFileName:(NSString *)fileName;
同じ内容で setCompletionBlockWithSuccess が違うのですが、コードが重複しているので判断が悪いと思います。
NSURL *url = [NSURL URLWithString:urlPath];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:fileName];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
// BUT DIFFERENT HERE
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
[operation start];
では、コードを複製したり、ファイルをダウンロードするメソッドにセレクターを渡したりするのに適したバリアントはどれだと思いますか。
また、セレクターを実行すると、次の警告が表示されます。
PerformSelector may cause a leak because its selector is unknown