IOS Queue Асинхронные загрузки - PullRequest
       6

IOS Queue Асинхронные загрузки

0 голосов
/ 24 августа 2011

Я столкнулся с проблемой создания очереди асинхронных загрузок из 3 файлов.

Я бы хотел, чтобы после окончания загрузки и сохранения первых файлов началось скачивание второго, а затем третьего ...

На данный момент я использую 3 IBAction для загрузки в папку «Документы», и она отлично работает, но сделать это автоматически для всех файлов не получилось.

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

Это код, который я использую:

// Download song 1
- (IBAction)download {

[self performSelector:@selector(downloadmusic) withObject:nil afterDelay:0.0];

}


- (void)downloadmusic
{
self.log = [NSMutableString string];
[self doLog:@"1/13"];

// Retrieve the URL string
int which = [(UISegmentedControl *)self.navigationItem.titleView selectedSegmentIndex];
NSArray *urlArray = [NSArray arrayWithObjects: SONG1_URL, nil];
NSString *urlString = [urlArray objectAtIndex:which];

// Prepare for download
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

// Set up the Download Helper and start download
[DownloadHelper sharedInstance].delegate = self;
[DownloadHelper download:urlString];

}

// Download song 2
- (void)downloadmusic2 
{

self.log = [NSMutableString string];
[self doLog:@"2/13"];

// Retrieve the URL string
int which = [(UISegmentedControl *)self.navigationItem.titleView        selectedSegmentIndex];
NSArray *urlArray = [NSArray arrayWithObjects: SONG2_URL, nil];
NSString *urlString = [urlArray objectAtIndex:which];

// Prepare for download
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

// Set up the Download Helper and start download
[DownloadHelper sharedInstance].delegate = self;
[DownloadHelper download:urlString];


}


// Download song 3
- (void)downloadmusic3 
{

self.log = [NSMutableString string];
[self doLog:@"3/13"];

// Retrieve the URL string
int which = [(UISegmentedControl *)self.navigationItem.titleView selectedSegmentIndex];
NSArray *urlArray = [NSArray arrayWithObjects: SONG3_URL, nil];
NSString *urlString = [urlArray objectAtIndex:which];

// Prepare for download
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

// Set up the Download Helper and start download
[DownloadHelper sharedInstance].delegate = self;
[DownloadHelper download:urlString];


}



- (void) doLog: (NSString *) formatstring, ...
{
va_list arglist;
if (!formatstring) return;
va_start(arglist, formatstring);
NSString *outstring = [[[NSString alloc] initWithFormat:formatstring arguments:arglist] autorelease];
va_end(arglist);
[self.log appendString:outstring];
[self.log appendString:@"\n"];
[textView setText:self.log];
}

- (void) restoreGUI
{
self.navigationItem.rightBarButtonItem = BARBUTTON(@"Get Data", @selector(action:));
if ([[NSFileManager defaultManager] fileExistsAtPath:DEST_PATH])
    self.navigationItem.leftBarButtonItem = BARBUTTON(@"Play", @selector(startPlayback:));  
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
[(UISegmentedControl *)self.navigationItem.titleView setEnabled:YES];
[progress setHidden:YES];

}

- (void) dataDownloadAtPercent: (NSNumber *) aPercent
{
[progress setHidden:NO];
[progress setProgress:[aPercent floatValue]];
}

- (void) dataDownloadFailed: (NSString *) reason
{
[self restoreGUI];
if (reason) [self doLog:@"Download failed: %@", reason];
}

- (void) didReceiveFilename: (NSString *) aName
{
self.savePath = [DEST_PATH stringByAppendingString:aName];


}

- (void) didReceiveData: (NSData *) theData
{
if (![theData writeToFile:self.savePath atomically:YES])
    [self doLog:@"Error writing data to file"];

[theData release];
[self restoreGUI];
[self doLog:@"Download succeeded"];


//[self performSelector:@selector(downloadmusic2) withObject:nil afterDelay:1.0];


    //[self performSelector:@selector(downloadmusic3) withObject:nil afterDelay:1.0];


}

1 Ответ

2 голосов
/ 24 августа 2011

Внутри вашего контроллера создайте три блока и скопируйте их в массив, который будет служить вашей очередью.Этот массив необходимо будет сохранить как переменную экземпляра, чтобы к нему можно было обращаться при последующих вызовах методов в вашем классе контроллера.Каждый из трех блоков должен создать и выполнить NSURLConnection, который асинхронно загружает соответствующий файл.Делегатом каждого NSURLConnection может быть ваш контроллер, и он должен реализовывать метод делегата -connectionDidFinishLoading:.Из этого метода вызовите метод, который выталкивает первый блок из очереди и выполняет его.

Затем просто вызовите метод в первый раз, чтобы запустить процесс.Очевидно, что вам нужно обеспечить некоторые крайние случаи и обработку ошибок, но это основная идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...