0

最近、FTP 接続のタイムアウトの短縮に関する質問を投稿しました (必要に応じて、ここをクリックして参照してください)。

ここで、FTP ダウンロードに使用しているコンポーネントに焦点を当てた、より具体的な質問を投稿するよう求められました。

Nico Kreipke の FTPManager を使用しています (ここをクリックして GitHub に移動します)。

私たちが実装しようとしているのは、FTP アドレスからデータをダウンロードすることです。それが失敗した場合は、HTTPS Web サーバーを使用するようにフォールバックします。

提供した FTP アドレスが使用できない場合、タイムアウトまでに約 1 分かかります。

問題は、どうすればそのタイムアウトを短縮できるかということです。

敬具、
ティアゴ

追加情報

言い忘れていましたが、FTP 接続は IP (ローカル ネットワーク) で行われます。

ヨハンのヒント

doubleという名前のプロパティを FTPManager に追加しましたtimeout

次にserverReadStream、読み取りストリームを保持するために FTPManager 全体で使用されるプロパティである のアクセサをオーバーライドし、すべてのリクエストのタイムアウト間隔を設定しました。

- (NSInputStream *)serverReadStream
{
    return _serverReadStream;
}

- (void)setServerReadStream:(NSInputStream *)serverReadStream
{
    if ((_serverReadStream = serverReadStream)) {
        CFNumberRef number = CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &_timeout);
        CFReadStreamSetProperty((__bridge CFReadStreamRef)(_serverReadStream), _kCFStreamPropertyReadTimeout, number);
        CFRelease(number);
    }
}

_kCFStreamPropertyReadTimeoutによって定義されます。

#define _kCFStreamPropertyReadTimeout CFSTR("_kCFStreamPropertyReadTimeout")

ただし、タイムアウトにはまだ約 1 分かかります。を作成した直後、FTPアドレスに接続する前にタイムアウトを設定しましたftpManager。タイムアウトを設定するために使用するコードは次のとおりです。

FTPManager *ftpManager = [[FTPManager alloc] init];
[ftpManager setTimeout:10];
4

2 に答える 2

0

performSelector:withObject:afterDelay:接続が既に確立されているかどうかを確認し、データを受信できるかどうかを確認するカスタム メソッドで使用するようなものを試しましたか? そうでない場合は呼び出し[ftpManager abort]ますか?

実際の接続タイムアウトではなく、ちょっと汚れているように見えますが、仕事をする必要があります。

于 2013-10-11T20:26:22.790 に答える
0

CFReadStreamのプロパティを設定するだけでできると思います。したがって、おそらく FTPManager をサブクラス化する必要があります。

プロパティは _kCFStreamPropertyReadTimeout と呼ばれます。

#define _kCFStreamPropertyReadTimeout CFSTR("_kCFStreamPropertyReadTimeout")

次に、これを適切なメソッドに追加します。

    double timeout = 30;
    CFReadStreamRef readStream = CFReadStreamCreateWithFTPURL(NULL, (__bridge CFURLRef)[[server.destination ftpURLForPort:server.port] URLByAppendingPathComponent:fileName]);

    CFNumberRef number = CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &timeout);
    CFReadStreamSetProperty(readStream, _kCFStreamPropertyReadTimeout, number);
    CFRelease(num);
于 2013-10-10T19:31:43.870 に答える