图像间歇下载

时间:2013-05-06 11:48:01

标签: ios objective-c download

我有一个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] ];
    }

}

任何人都可以了解为什么这适用于文档,但仅适用于首次运行时的图像,而不是随后的图像?

1 个答案:

答案 0 :(得分: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)条件为真,下次不下载图像。如果你想下载它,然后从模拟器或设备中删除你的应用程序并清理然后运行应用程序。