-1

iPadでアプリケーションをコンパイルしようとしています。AFNetworking を使用して、FTP 上のファイルのリストを取得しています。アプリケーションはシミュレーターで動作しますが、iPad で起動すると、リストを含むファイルの (null) コンテンツが取得されます。コードは次のとおりです。

- (void) getListOfFiles {

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL  URLWithString:@"ftp://anonymous@ftphost/"]];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

NSString *path = [[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"list"];

operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:YES];


[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, NSHTTPURLResponse *response) {
         NSLog(@"Success %@",operation.response);
}
            failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                NSLog(@"Error: %@", [error localizedDescription]);
                                 }];

[operation start];
NSString *content  = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding  error:nil];

NSLog (@"%@",content);
}

したがって、変数 content = (null) は iPad でのみ、シミュレーターではすべて問題ありません。助けてください、私は希望を失いました)

4

2 に答える 2

1

AFHTTP * Operationsは、デフォルトではすべて非同期です。

同期(ブロッキング)呼び出しがメインスレッドをブロックするため、これは適切です

操作を開始し、その直後にファイルの内容を取得します。開始呼び出しはASYNCであり、opを開始するだけで、それを待たないため、これは確実に機能しません。

それを待つか...それはスレッドをブロックするので悪いです:

[operation start];
[operation waitUntilDone];

または非同期で動作するようにgetFilesを変更する方がはるかに優れています:

- (void) getListOfFiles {
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL  URLWithString:@"URL"]];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    NSString *path = [[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"list"];
    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:YES];


    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, NSHTTPURLResponse *response) {
             NSLog(@"Success %@",operation.response);
             NSString *content  = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding  error:nil];
             NSLog (@"%@",content);
        }
        failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error: %@", [error localizedDescription]);
        }];

    [operation start];
}
于 2013-01-28T09:09:32.567 に答える
0

わかりました、問題は解決しました。バンドルディレクトリに書き込めないので、代わりに次のコードを使用する必要があります。

NSArray *paths = NSSearchPathForDirectoiesDomain(NSDocumentDirectory,NSCachesDirectory,YES);
NSString *path = [[paths objectAtIndex:0] stingByAppendingPathComponent:@"list"];
于 2013-01-29T00:11:49.147 に答える