2013-05-06 68 views
0

我有一個iPad應用程序,它連接到C#Web服務以下載文檔和圖像。間歇性地下載圖像

如果我在iPad上運行它作爲全新安裝,它會下載預期的文檔和圖像。如果我上傳新文檔並重新啓動應用,則會按預期下載。但是,如果我將新映像上載到服務器並再次運行,它不會下載新映像。

下面是檢查和下載文件的代碼:

- (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]; 
} 

和:

- (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]; 
    } 
} 

這是對圖像中的相應代碼:

- (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]; 
} 

和:

- (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] ]; 
    } 

} 

任何人都可以闡明爲什麼這適用於文檔,但僅適用於第一次運行但不是隨後的圖像?

+0

它給出錯誤? – 2013-05-06 12:09:23

+0

沒有我意識到的錯誤。 – Robert 2013-05-06 12:10:55

回答

1

1)上didFinishLaunchingWithOptions方法

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

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

2)寫此在NSUserDefaults的

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

3)執行應用程式下一次時則(1)的條件。當圖像下載完成,則存儲值是真的,下次不下載圖片。如果你想下載,然後從模擬器或設備刪除你的應用程序,然後清理,然後運行應用程序。

+0

當你說'呼籲下載圖像或圖像下載代碼'你的意思是調用'checkLinks'方法?例如'[myViewController checkLinks]'? – Robert 2013-05-06 12:50:03

+0

是的,開始下載的方法。 – 2013-05-06 12:52:17

+0

好的。這不是一個類方法,所以我怎麼去從appDelegate調用它呢? – Robert 2013-05-06 13:02:31