Несколько NSURLConnection & NSRunLoop - PullRequest
       16

Несколько NSURLConnection & NSRunLoop

1 голос
/ 17 августа 2010

Я пытаюсь ускорить загрузку моего приложения. Я использовал Asynchronous NSURLConnection для загрузки содержимого с сервера, он работал нормально с одним подключением.

Я использую код из этого поста для реализации нескольких объектов делегатов. Несколько делегатов NSURLConnection в Objective-C

Когда я создал 2 объекта NSURLConnection, каждый пытается загрузить разные файлы. Была вызвана функция обратного вызова didReceiveData, но она получала данные только первого объекта NSURLConnection до тех пор, пока не было установлено первое соединение, затем она начала получать данные от второго NSURLConnection. Я хочу, чтобы эти два соединения принимали данные одновременно, что мне делать? Вот мой текущий код.

-(IBAction) startDownloadClicked :(id) sender 
{
    while (bDownloading)
    {
        int nCurrentCon = 0;
        while (nCurrentCon < 2) 
        {                               
            [self downloadAFile:[filenameArray objectAtIndex:nCurrentCon]];
            nCurrentCon++;
        }

    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
    }

}

- (void) downloadAFile: (NSString*) filename
{
    NSString* urlstr = @"ftp://myftpusername:password@hostname";
    NSURLRequest* myreq = [NSURLRequest requestWithURL:[NSURL URLWithString:urlstr]];

    DownloadDelegate* dd = [[DownloadDelegate alloc] init]; //create delegate object
    MyURLConnection* myConnection = [[MyURLConnection alloc] initWithRequest:myreq delegate:dd 
                                                            startImmediately:YES];

}

Затем в моем объекте Delegate я реализовал эти подпрограммы

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{       
    [receiveBuffer setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"receiving data for %@", targetFileName); //the file name were set when this delegate object is initialized.
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"Download Failed with Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);  
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{       
    NSLog(@"File %@ - downloaded.", targetFileName);
}

1 Ответ

1 голос
/ 17 августа 2010

Ваш код выглядит хорошо.У меня есть аналогичная установка, которая работает успешно (хотя, кажется, существует ограничение в четыре одновременных соединения).

Основное различие между вашим и моим кодом в том, что вы используете FTP, а я использую HTTP.Почему бы вам не попробовать это с HTTP-соединениями, просто чтобы посмотреть, не столкнулись ли вы с ограничением FTP-соединений на iPhone?

...