2012-07-13 69 views
0

现在,当我的应用程序检测到服务器上的文件已更新时,它会下载文件和用户界面以阻止下载时间。我的应用程序中有ASIHTTPRequest包装器,但我不知道如何将我的下载请求更改为异步。如何使用异步请求下载文件?

我的代码:

- (void)downloadFileIfUpdated 
{ 
    NSString *urlString = @"http://www.mysite.com/data.plist"; 
    NSLog(@"Downloading HTTP header from: %@", urlString); 
    NSURL *url = [NSURL URLWithString:urlString]; 

    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *cachedPath = [[documentPaths lastObject] stringByAppendingPathComponent:@"data.plist"]; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    BOOL downloadFromServer = NO; 

    NSString *lastModifiedString = nil; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPMethod:@"HEAD"]; 
    NSHTTPURLResponse *response; 
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error: NULL]; 
    if ([response respondsToSelector:@selector(allHeaderFields)]) { 
     lastModifiedString = [[response allHeaderFields] objectForKey:@"Last-Modified"]; 
    } 

    NSDate *lastModifiedServer = nil; 
    @try { 
     NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
     df.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'"; 
     df.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
     df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
     lastModifiedServer = [df dateFromString:lastModifiedString]; 

    } 
    @catch (NSException * e) { 
    NSLog(@"Error parsing last modified date: %@ - %@", lastModifiedString, [e description]); 
    } 
    NSLog(@"lastModifiedServer: %@", lastModifiedServer); 

    NSDate *lastModifiedLocal = nil; 
    if ([fileManager fileExistsAtPath:cachedPath]) { 
     NSError *error = nil; 
     NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:cachedPath error:&error]; 
     if (error) { 
      NSLog(@"Error reading file attributes for: %@ - %@", cachedPath, [error localizedDescription]); 
     } 
     lastModifiedLocal = [fileAttributes fileModificationDate]; 
     NSLog(@"lastModifiedLocal : %@", lastModifiedLocal); 

     [activityIndicator stopAnimating]; 
    } 

    // Download file from server if we don't have a local file 
    if (!lastModifiedLocal) { 
     downloadFromServer = YES; 
    } 
    // Download file from server if the server modified timestamp is later than the local modified timestamp 
    if ([lastModifiedLocal laterDate:lastModifiedServer] == lastModifiedServer) { 


     [activityIndicator startAnimating]; 


     downloadFromServer = YES; 
    } 

    if (downloadFromServer) { 


     NSLog(@"Downloading new file from server"); 
     NSData *data = [NSData dataWithContentsOfURL:url]; 
     if (data) { 
      // Save the data 
      if ([data writeToFile:cachedPath atomically:YES]) { 
       NSLog(@"Downloaded file saved to: %@", cachedPath); 
      } 

      // Set the file modification date to the timestamp from the server 
      if (lastModifiedServer) { 
       NSDictionary *fileAttributes = [NSDictionary dictionaryWithObject:lastModifiedServer forKey:NSFileModificationDate]; 
       NSError *error = nil; 
       if ([fileManager setAttributes:fileAttributes ofItemAtPath:cachedPath error:&error]) { 
        NSLog(@"File modification date updated"); 
        [NSThread detachNewThreadSelector:@selector(loadPList) toTarget:self withObject:nil]; 

        [activityIndicator stopAnimating]; 



       } 
       if (error) { 
       NSLog(@"Error setting file attributes for: %@ - %@", cachedPath, [error localizedDescription]); 
       } 
      } 
     } 


    } 

} 
+0

什么与苹果文档wromg http://developer.apple.com/library/ios/#DOCUMENTATION/ Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#// apple_ref/doc/uid/20001836-BAJEAIEE - 它提出了一种方法,并且在注释的最后给出了sendSynchronousRequest并不推荐使用这种方法,因为它有严格的限制 – Mark 2012-07-13 10:26:54

回答

1
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 
__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
[request setCompletionBlock:^{ 
    // Use when fetching text data 
    NSString *responseString = [request responseString]; 

    // Use when fetching binary data 
    NSData *responseData = [request responseData]; 
}]; 
[request setFailedBlock:^{ 
    NSError *error = [request error]; 
}]; 
[request startAsynchronous]; 

欲了解更多详细看http://allseeing-i.com/ASIHTTPRequest/How-to-use#using_blocks

+0

是的,我看过这个例子..但不能mo dify我的代码 – 2012-07-13 10:40:12

+0

在'if(downloadFromServer){...}'而不是你现在所做的事情中,放入来自示例的代码。只需将URL替换为您所需的。 – 2012-07-13 10:52:55

+0

好的..现在它可以工作......但它给了我一个ARC保留周期问题:在这个块中强烈地捕获'请求'很可能导致保留周期 – 2012-07-13 11:03:40