2010-05-24 5 views
1

J'ai une application iPhone qui télécharge plusieurs fichiers WAV à partir du Web, stockant les données audio résultantes sur le téléphone pour les lire dans l'application. Parfois, cela fonctionne très bien, et parfois je deviens l'un des deux problèmes avec le son:Téléchargement/lecture de fichiers audio statiques sur l'iPhone

1) Il y a des morceaux d'un fichier audio téléchargés qui soient lus comme staticky, corrompu bruit

2) Parfois, le plein le téléchargement ne semble pas se produire, ce qui signifie que les données binaires ne sont pas reconnaissables en tant que fichier son légitime et étouffent ma bibliothèque de lecture (FMOD), causant un plantage.

J'utilise un NSURLConnection pour construire les données en ajoutant des données reçues de la connexion, comme décrit dans les documents d'Apple. Ma question est la suivante: comment puis-je écrire mon code de téléchargement afin de m'assurer que tous les fichiers sont téléchargés et qu'ils sont téléchargés sans la corruption/le bruit?

Faits:

  • Les téléchargements se passent d'Amazon S3.
  • Ils ont une taille maximale d'environ un demi-mégaoctet.
  • Elles ne sont pas corrompues sur le serveur, c'est-à-dire qu'elles sont correctement lues dans un navigateur, même si elles sont vissées sur le téléphone.

Voici le code que j'utilise pour télécharger tous les fichiers non téléchargés à chaque lancement d'application. Merci d'avance pour votre aide!

- (void)downloadOutstandingFileSounds{ 
    NSArray *theFiles = [File listOfDownloadableOpponentfiles]; 

    if ([theFiles count] > 0) { 
     NSLog(@"Updating %d new files...", [theFiles count]); 
     for (File *file in theFiles) { 
      self.theFile = file;   
      NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:file.publicUrl] 
                 cachePolicy:NSURLRequestUseProtocolCachePolicy 
                timeoutInterval:60.0]; 
      NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
      if (theConnection) { 
       currentFileDataContainer = [[NSMutableData data] retain]; 
      }else { 
       NSLog(@"failed attempt to download resource at: %@", file.publicUrl); 
      } 

     } 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"OutstandingFileSoundsDownloaded" object:self]; 
    } 
} 

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

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
    [connection release]; 
    [currentFileDataContainer release]; 

    NSLog(@"Connection failed! Error - %@ %@", 
      [error localizedDescription], 
      [[error userInfo] objectForKey:NSErrorFailingURLStringKey]); 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSMutableData *)data{ 
    [currentFileDataContainer appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    NSLog(@"Success! Received %d bytes of file data", [currentFileDataContainer length]); 
    self.theFile.fileSoundData = currentFileDataContainer; 
    [self.theFile save]; 
    NSLog(@"Downloadable files count: %d", [[File listOfDownloadableOpponentfiles] count]); 
    self.theFile = nil; 
    [File clearCache]; 
} 

Répondre

1

Je ne vois rien trop mal avec votre approche, mais jetez un oeil à la bibliothèque ASIHTTPRequest http://allseeing-i.com/ASIHTTPRequest/ Cela peut être utilisé pour la file d'attente un certain nombre de téléchargements et de gérer les erreurs.

+0

Oh cool. J'avais un peu utilisé ASI mais je n'en avais jamais eu besoin pour résoudre un problème dans ce contexte. J'aime l'aspect de la file d'attente d'opération d'ASI, mais je pense que son support de gzip pourrait être la vraie chose qui pourrait probablement résoudre mon problème ici - merci de m'avoir renvoyé à lui. – trevrosen

+0

BTW vous semble avoir posé un certain nombre de questions, mais pas accepté de réponses. Vous devriez revenir sur ce que vous avez demandé, et accepter la bonne réponse (en supposant qu'il y en ait une): c'est ce dont parle ce site! – Andiih

+0

Est-ce que c'est ce que le bouton "Répondre à votre question" est censé faire? Je cherchais comment faire ça (accepter). Je vais regarder plus fort. :-) ASI s'est avéré efficace pour résoudre ce problème. Je n'ai pas regardé le code, mais je suppose qu'il sauve mieux les erreurs pendant le transfert. La classe ASINetworkQueue est très sympa. Je vais certainement utiliser cette bibliothèque plus souvent. Il y a même eu quelques tentatives de support pour l'API S3 cuite directement! – trevrosen