2013-05-06 3 views
0

J'ai une application iPad qui se connecte à un service Web C# pour télécharger des documents et des images.Téléchargement d'images par intermittence

Si je l'exécute comme une nouvelle installation sur l'iPad, il télécharge les documents et images attendus. Si je télécharge un nouveau document et relance l'application, il le télécharge comme prévu. Toutefois, si je télécharge une nouvelle image sur le serveur et la réexécute, la nouvelle image ne sera pas téléchargée.

Voici le code pour le contrôle et le téléchargement de documents:

- (void)checkFiles:(NSString *)sessionID 
{ 
    fileList = [[NSMutableString alloc] init]; 

    // get contents of doc directory 
    NSArray *directoryPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [directoryPaths objectAtIndex:0]; 
    NSString *downloadsFolderString = [documentsDirectory stringByAppendingPathComponent:DOWNLOADS_FOLDER]; 
    NSError *error = nil; 
    NSString* file; 
    NSDirectoryEnumerator* enumerator = [[NSFileManager defaultManager] enumeratorAtPath:downloadsFolderString]; 
    while (file = [enumerator nextObject]) 
    { 
     BOOL isDirectory = NO; 

     [[NSFileManager defaultManager] fileExistsAtPath: [NSString stringWithFormat:@"%@/%@", downloadsFolderString,file] 
             isDirectory: &isDirectory]; 
     if ([file rangeOfString:@"LinkIcons"].location == NSNotFound) 
     {   
      if (!isDirectory) 
      { 
       [fileList appendString:[NSString stringWithFormat:@"%@|", file]]; 
      } 
     } 
    } 

    // create string to send to server 
    NSString *post = [NSString stringWithFormat:@"sessionID=%@&fileList=%@&dateTime=%@&userID=%@", sessionID, fileList, timeOpened, userID]; 
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 
    NSString *comparisonURLString = SERVER_COMPARE_URL_STRING; 
    NSURL *comparisonURL = [NSURL URLWithString:comparisonURLString]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:comparisonURL]; 
    [request setHTTPMethod:@"POST"]; 
    [request addValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setHTTPBody:postData]; 

    // get response - list of files for download 
    NSHTTPURLResponse *urlResponse = nil; 
    error = nil; 
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error]; 

    if (responseData) 
    { 
     NSString *requiredFilesList = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 

    // remove xml nodes from list 
    NSArray *lines = [requiredFilesList componentsSeparatedByString: @"\n"]; 

    if (lines.count > 2) 
    {    
     // create sub array without xml nodes 
     NSRange theRange; 
     theRange.location = 2; 
     theRange.length = [lines count] -3; 
     numberOfFilesToBeDownloaded = theRange.length;    

     if (numberOfFilesToBeDownloaded <= 0) 
     { 
      _jobStatusLabel.text = @"Documents up to date"; 
     } 

      if (numberOfFilesToBeDownloaded > 0) 
      { 
       NSArray *subArray = [lines subarrayWithRange:theRange];    
       [self getFiles:subArray];    
      } 
     } 
    } 
    [self checkLinks]; 
} 

et:

- (void)getFiles:(NSArray *)filenames 
{ 
    downloadManager = [[DownloadManager alloc] init]; 
    downloadManager.delegate = self; 

    NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 
    NSString *downloadFolder = [documentsPath stringByAppendingPathComponent:@"downloads"]; 

    for (NSString *filename in filenames) 
    { 
     NSString *downloadFilename = [downloadFolder stringByAppendingPathComponent:filename]; 
     NSString *baseUrlString = SERVER_DOWNLOAD_URL_STRING; 
     NSString *finalUrlString = [baseUrlString stringByAppendingPathComponent:[filename stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

     [downloadManager addDownload:downloadFilename fromUrl:[NSURL URLWithString:finalUrlString] ]; 
     [self notifyServerFileDownloaded:filename]; 
    } 
} 

Et cela est le code correspondant pour les images:

- (void) checkLinks 
{ 
    NSMutableString *linkListOnDevice = [[NSMutableString alloc] init]; 
    NSMutableArray *globalLinksArray = [[[NSUserDefaults standardUserDefaults] objectForKey:@"globalLinksArray"]mutableCopy]; 

    if(globalLinksArray != nil) 
    { 
     NSLog(@"Links Array found. Contents: %@", globalLinksArray); 
    } 
    else 
    { 
     globalLinksArray = [[NSMutableArray alloc] initWithCapacity:0]; 
    } 
    NSArray *directoryPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [directoryPaths objectAtIndex:0]; 
    NSString *downloadsFolderString = [documentsDirectory stringByAppendingPathComponent:DOWNLOADS_FOLDER]; 
    NSString *LinksFolderString = [downloadsFolderString stringByAppendingPathComponent:@"/LinkIcons"]; 
    NSError *error = nil; 
    NSString* file; 
    NSDirectoryEnumerator* enumerator = [[NSFileManager defaultManager] enumeratorAtPath:LinksFolderString]; 

    while (file = [enumerator nextObject]) 
    { 
     BOOL isDirectory = NO; 

     [[NSFileManager defaultManager] fileExistsAtPath: [NSString stringWithFormat:@"%@/%@",downloadsFolderString,file] 
             isDirectory: &isDirectory]; 
     if (!isDirectory) 
     { 
      [linkListOnDevice appendString:[NSString stringWithFormat:@"%@|", file]]; 
     } 
    } 

    // create string to send to server 
    NSString *post = [NSString stringWithFormat:@"iconsList=%@&userID=%@", linkListOnDevice, userID]; 
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 
    NSString *comparisonURLString = SERVER_COMPARE_LINK_ICONS_URL_STRING; 
    NSURL *comparisonURL = [NSURL URLWithString:comparisonURLString]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:comparisonURL]; 
    [request setHTTPMethod:@"POST"]; 
    [request addValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setHTTPBody:postData]; 

    // get response - list of files for download 
    NSHTTPURLResponse *urlResponse = nil; 
    error = nil; 
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error]; 
    NSString *requiredIconsList = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 

    // remove xml nodes from list 
    NSArray *lines = [requiredIconsList componentsSeparatedByString: @"\n"]; 

    // create sub array without xml nodes 
    NSRange theRange; 
    theRange.location = 2; 
    theRange.length = [lines count] -3; 
    numberOfFilesToBeDownloaded += theRange.length; 

    NSArray *linkSubArray = [lines subarrayWithRange:theRange]; 
    NSMutableArray *iconsArray = [[NSMutableArray alloc] initWithCapacity:0]; 

    NSString *linkDetail; 
    for (linkDetail in linkSubArray) { 
     [globalLinksArray addObject:linkDetail]; 
    } 
    [[NSUserDefaults standardUserDefaults] setObject:globalLinksArray forKey:@"globalLinksArray"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 

    // separate file for download from rest of string 
    for (NSString *linkString in linkSubArray) 
    { 
     NSArray *spltArray = [linkString componentsSeparatedByString:@"^"]; 
     NSString *linkIconString = spltArray[3]; 
     [iconsArray addObject:linkIconString]; 
    } 
    [self getLinks:iconsArray]; 
} 

et:

- (void) getLinks: (NSMutableArray *) linkList 
{  
    NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 
    NSString *downloadFolder = [documentsPath stringByAppendingPathComponent:@"downloads"]; 

    for (NSString *filename in linkList) 
    { 
     NSString *downloadFilename = [downloadFolder stringByAppendingPathComponent:filename]; 
     NSString *baseUrlString = SERVER_DOWNLOAD_URL_STRING; 
     NSString *finalUrlString = [baseUrlString stringByAppendingPathComponent:[filename stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

     [downloadManager addDownload:downloadFilename fromUrl:[NSURL URLWithString:finalUrlString] ]; 
    } 

} 

Quelqu'un peut-il faire la lumière sur pourquoi cela fonctionne pour les documents, mais pour les images seulement en première exécution, mais pas par la suite?

+0

il donne une erreur? –

+0

Pas d'erreurs que je connais. – Robert

Répondre

1

1) écrire ceci sur méthode didFinishLaunchingWithOptions

 NSString *savedValue = [[NSUserDefaults standardUserDefaults]  
    stringForKey:@"FirstTime"]; 

    if (![savedValue isEqualToString:@"1"]) 
    { 
      //Call for download image OR image downloading coding. 
    } 

2) Lorsque l'image téléchargeant la valeur du magasin complet en NSUserDefaults

 NSString *valueToSave = @"1"; 
     [[NSUserDefaults standardUserDefaults] 
     setObject:valueToSave forKey:@"FirstTime"]; 

3) lorsque la prochaine fois que votre application est alors exécuté (1) état est vrai et ne télécharge pas l'image la prochaine fois. Si vous voulez télécharger ceci puis supprimez votre application du simulateur ou de l'appareil et nettoyez puis exécutez l'application.

+0

Quand vous dites 'Appelez pour télécharger l'image OU le codage de téléchargement d'image' vous voulez dire appeler la méthode' checkLinks'? par exemple. '[myViewController checkLinks]'? – Robert

+0

Oui, méthode qui commence à télécharger. –

+0

OK. Ce n'est pas une méthode de classe alors comment pourrais-je l'appeler depuis appDelegate? – Robert

Questions connexes