2013-11-20 3 views
-1

В моем приложении и при запуске я проверяю, были ли базы данных изменены на сервере с копией, хранящейся локально. Я использую синхронный запрос на сервер, и я делаю проверку на основе последних измененных полей времени даты в ответе HTTP.проверить, обновлен ли файл на сервере

Если последнее измененное время данных файла на сервере -> последняя измененная дата время локального файла Я спрашиваю пользователя, хочет ли он обновить базу данных, если он согласится загрузить базу данных.

Я использую свою машину в качестве сервера, но проблема, когда мне выключить машины, аварии при запуске приложения

Спасибо вам за помощь

Вы найдете ниже мой код

#import "FirstViewController.h" 

@interface FirstViewController() 

@end 

@implementation FirstViewController 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 



    // check connectivity 
    if ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] == NotReachable) { 
     [self displayConenctivityAlert]; 

    }else{ 

     [self checkDatabases]; 

    } 



} 




- (void) checkDatabases { 


    bool res = [self fileUpdated]; 


    if (res){ 
     // Ask user if he would like to update the databases  
    } 

} 




-(void) displayConenctivityAlert{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:[TSLanguageManager localizedString:@"NO_CONNECTED"] delegate:self cancelButtonTitle:[TSLanguageManager localizedString:@"OK"] otherButtonTitles:nil]; 

    [alert show]; 
} 



- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
    NSLog(@"Error HTTP ..."); 
} 




- (BOOL)fileUpdated { 
    NSString *urlString = @"http://192.168.0.10:8888/fuel/stations.db"; 
    NSLog(@"Downloading HTTP header from: %@", urlString); 
    NSURL *url = [NSURL URLWithString:urlString]; 


    //store locally data into the resource folder. 
    NSString *documentsDirectory = [Utility documentsPath]; 



    NSString *cachedPath = [documentsDirectory stringByAppendingPathComponent:@"stations.db"]; 
    NSLog(@"Local URL/%@", cachedPath); 
    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); 
    } 

    // 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) { 
     downloadFromServer = YES; 
    } 

    return downloadFromServer; 
} 

@end 
+0

какая ошибка вы получаете от аварии? –

+0

com.treenityconsulting.istation не удалось запустить вовремя, я думаю, это связано с синхронным HTTP-запросом, требуется время, потому что сервер не работает – user2762628

ответ

2

Ваше приложение терпит крах, потому что он занимает слишком много времени, чтобы завершить didFinishLaunching системный сторожевой таймер убивает ваше приложение. Это связано с тем, что вы делаете синхронный http-запрос в viewDidLoad вашего контроллера корневого представления, который должен быть завершен до того, как вы сможете закончить запуск. Вы можете решить эту проблему несколькими способами, либо выполните свой HTTP-запрос асинхронно, вызвав sendAsynchronousRequest:queue:completionHandler на ваш NSURLConnection. Другой вариант - вывести этот код из вашего запуска, возможно, переместив код в viewDidAppear вашего контроллера. Это имеет побочный эффект выполнения проверки при каждом возврате к представлению, а не только при начальной загрузке.

Короче говоря, выполнение синхронного HTTP-запроса является большим, нет, потому что ваш пользовательский интерфейс будет зависать, пока запрос не будет завершен. В этом случае это особенно плохо, потому что вы заставляете свой запуск задерживаться до тех пор, пока запрос не будет завершен, что приведет к его сбою, когда сервер не работает.

-1

Проблема решена

Я использую сейчас

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){ 


} 

вместо

[NSURLConnection sendSynchronousRequest:request returningResponse:&response error: NULL]; 
+0

Это решение, которое я предложил в своем ответе. Если мое решение устранило вашу проблему, вы должны принять мой ответ, нажав кнопку «Проверить», чтобы указать, что вместо ответа на себя. Рад, что ваша проблема исправлена, и добро пожаловать в SO! –

Смежные вопросы