iOS nkreipke / FTPManager:如何减少超时?

时间:2013-10-10 19:11:07

标签: ios ftp

我最近发布了一个关于减少FTP连接超时的问题(click here to see it if you want)。

现在,我被要求发布一个更具体的问题,重点关注我们用于FTP下载的组件。

我们正在使用Nico Kreipke的FTPManager(click here to go to its GitHub)。

我们要尝试实现的是从FTP地址下载数据,如果失败,我们将回退使用HTTPS Web服务器。

当我们提供的FTP地址不可用时,超时大约需要一分钟。

问题是,如何减少超时?

最好的问候,
蒂亚戈

更多信息

我忘了说,FTP连接是通过IP(本地网络)完成的。

Johan的提示

我向FTPManager添加了一个属性,double名为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")

但是,超时仍需要大约一分钟。在创建ftpManager之后,我在连接到FTP地址之前设置了超时。我用来设置超时的代码如下:

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您是否尝试过使用performSelector:withObject:afterDelay:和自定义方法检查是否已建立连接并且可以接收数据,或者调用[ftpManager abort]

不是一个真正的连接超时,看起来有点脏,但应该做的工作。