1

サーバーからファイルを取得するために 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
4

1 に答える 1