我怎样才能恢复ASINetworkQueue?

时间:2011-11-06 02:09:50

标签: objective-c ios4 asihttprequest nsoperationqueue

我正在尝试从网络连接丢失的同一点恢复和排队。我的问题不在于可达性,而在于恢复下载。我整个周末度过,但没有运气。
非常感谢任何帮助。

下面的代码有方法commenceDownloadIfReachabilityIsOkay,当网络恢复时会调用它,但进度条不会移动,我看不到任何活动来判断下载是否已恢复。

此方法在控制器中被称为边缘IBAction

 - (void) downloadFile:(UIProgressView*)locprogressView;
    {

    // check for internet connection
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

    internetReachable = [[Reachability reachabilityForInternetConnection] retain];
    [internetReachable startNotifier];

    // check if a pathway to a random host exists
    hostReachable = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];
    [hostReachable startNotifier];

        if (![self asiqueue]) {
            [self setAsiqueue:[[[ASINetworkQueue alloc] init] autorelease]];
        }

     NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/ASIHTTPRequest/Tests/the_great_american_novel.txt"];

        self.request = [ASIHTTPRequest requestWithURL:url];
        _progressView=locprogressView;

        self.progressView= locprogressView;

        [asiqueue cancelAllOperations];
        [asiqueue setDownloadProgressDelegate:self.progressView];
        [asiqueue setDelegate:self];
        [asiqueue setRequestDidFinishSelector:@selector(queueComplete:)];
        [asiqueue setShowAccurateProgress:YES];
        // [queue setr

        [request setDelegate:self];
        // [request setDidReceiveDataSelector:@selector(didReceiveData:)];
        [request setDidFinishSelector:@selector(requestDone:)];
        [request setDidFailSelector:@selector(requestWentWrong:)];
        [request setAllowResumeForFileDownloads:YES];
        [[self asiqueue] addOperation:request]; //queue is an NSOperationQueue
        [[self asiqueue]go ];

}

此方法从checkNetworkStatus调用,我希望它继续下载

 - (void)commenceDownloadIfReachabilityIsOkay
    {
        if (self.asiqueue && self.hostActive && self.internetActive)
        {

            [[self asiqueue]go ];

        }

    }

此方法只是保持轮询以检查网络状态 - 取自How to check for an active Internet connection on iOS or OSX?

- (void) checkNetworkStatus:(NSNotification *)notice
{
    // called after network status changes

    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus)

    {
        case NotReachable:
        {
            NSLog(@"The internet is down.");
            self.internetActive = NO;

            break;

        }
        case ReachableViaWiFi:
        {
            NSLog(@"The internet is working via WIFI.");
            self.internetActive = YES;

            break;

        }
        case ReachableViaWWAN:
        {
            NSLog(@"The internet is working via WWAN.");
            self.internetActive = YES;

            break;

        }
    }

    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
    switch (hostStatus)

    {
        case NotReachable:
        {
            NSLog(@"A gateway to the host server is down.");
            self.hostActive = NO;

            break;

        }
        case ReachableViaWiFi:
        {
            NSLog(@"A gateway to the host server is working via WIFI.");
            self.hostActive = YES;

            break;

        }
        case ReachableViaWWAN:
        {
            NSLog(@"A gateway to the host server is working via WWAN.");
            self.hostActive = YES;

            break;

        }
    }

    [self commenceDownloadIfReachabilityIsOkay];
}

1 个答案:

答案 0 :(得分:2)

如果我正确理解你的代码,它希望调用:

[[self asiqueue]go ];

将导致ASIHTTPRequest在之前失败并重新开始下载。这有两个原因不起作用:

  1. 一旦ASIHTTPRequest失败,它就会从队列中删除。
  2. 在已调用go的队列上调用go 没什么
  3. 解决方案是重新请求重新启动它。

    此外,http://allseeing-i.com/ASIHTTPRequest/How-to-use#resuming_interrupted_downloads说:

      

    此外,您必须自己设置临时下载路径   (setTemporaryFileDownloadPath),包含部分数据的路径。

    你的代码似乎没有做的

    。 (您还需要setDownloadDestinationPath