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

}

任何人都可以阐明为什么这适用于文档但仅适用于第一次运行而不是随后的图像?

4

1 回答 1

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)条件为真,下次不会下载图像。如果您想下载它,请从模拟器或设备中删除您的应用程序并清理然后运行该应用程序。

于 2013-05-06T12:22:46.733 回答