2013-05-06 4 views
0

문서 및 이미지를 다운로드하기 위해 C# 웹 서비스에 연결되는 iPad 앱이 있습니다.이미지가 간헐적으로 다운로드 됨

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

} 

누구나 문서에서 작동하지만 이미지는 처음 실행했을 때만 표시되지만 이후에는 표시되지 않는 이유는 무엇입니까? 이미지 NSUserDefaults

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

3) 앱이 다음 실행 다음 (1) 상태에서 완전한 저장 한 다음 값을 다운로드 할 때

+0

오류가 발생합니까? –

+0

내가 아는 오류가 없습니다. – Robert

답변

1

1) didFinishLaunchingWithOptions 방법

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

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

2)에 쓰기 사실이며 다음에 이미지를 다운로드하지 않습니다. 이것을 다운로드하려면 시뮬레이터 나 장치에서 앱을 삭제하고 청소 한 다음 앱을 실행하십시오.

+0

'이미지 다운로드 또는 이미지 다운로드를 요청하십시오 '라고 말하면'checkLinks' 메서드를 호출하는 것입니까? 예 : '[myViewController checkLinks]'? – Robert

+0

예, 다운로드를 시작하는 방법입니다. –

+0

확인. 클래스 메소드가 아니므로 appDelegate에서 호출하는 방법은 무엇입니까? – Robert

관련 문제