0

ftpリクエストを非同期で実行しているときに問題が発生しました。正確な問題を明確に説明しようとしています:

- (void)viewDidLoad
{
    [super viewDidLoad];

    //I want to do a ftpListRequst in the background here
    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        NewFTPListService *nfl = [[NewFTPListService alloc] initWithFtpPath:@"ftp://root:@10.0.0.3/"];

        [nfl listDirectoryContents];

        [nfl release];

    }); 

    //other main thread code
}

- (NSArray *) listDirectoryContents
{   
    [_listDir start];

    //What I want to do here is to wait until the ftp request finish
    while (!self.isFinish) {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }

    NSLog(@"Request Finish!");

    return self.result;
}

-(void) start {
    ......
    self.streamInfo->readStream.delegate = self;
    [self.streamInfo->readStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [self.streamInfo->readStream open];

    //If request is blocked (may be the server is not avaliable), after a specific time, this block will be called
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, kWRDefaultTimeout * NSEC_PER_SEC), dispatch_get_current_queue(), ^{       
        [self.delegate requestFailed:self];
        [self destroy];
    });

}

リクエストを正常に実行すると、このメソッドが呼び出されます。

-(void) requestCompleted:(WRRequest *) request{

    self.isSucess = YES;
    self.isFinish = YES;
}

このメソッドは「dispatch_after」ブロックで呼び出されます

-(void) requestFailed:(WRRequest *) request{
    self.isSucess = NO;
    self.isFinish = YES; 
}

正常に要求されると、「RequestFinish!」という印刷が表示されます。リクエストがブロックされ、「dispatch_after」ブロックが呼び出されると、「requestFailed」メソッドが呼び出されますが、「RequestFinish!」という出力が表示されません。プログラムがどういうわけかwhileループでスタックしているようです(ループが実行されておらず、後のコードも実行されていません)。

さらに、プログラムを同期的に実行すると、次のようになります。

- (void)viewDidLoad
    {
        [super viewDidLoad];

        NewFTPListService *nfl = [[NewFTPListService alloc] initWithFtpPath:@"ftp://root:@10.0.0.3/"];

        [nfl listDirectoryContents];

        [nfl release];
    }

リクエストが失敗した場合でも、「リクエストの終了!」という印刷が正常に表示されます。これが発生した理由と、要求が失敗したときにプログラムを正常に実行できるようにこの問題を修正する方法を知りたいです。ありがとう!

4

1 に答える 1

0

こんにちは、このメソッドを performSelector で呼び出してください

[nfl listDirectoryContents];

または、viewDidAppear メソッドでこのメソッドを呼び出します。

于 2012-06-16T06:13:43.803 に答える