2014-09-04 2 views
1

AFNetworking을 사용하여 JSON 데이터를로드하는 방식이 효과적입니다.AFNetworking에서 이전 캐시를 지우는 방법은 무엇입니까?

SessionManager *sessionManager = [SessionManager sharedClient]; 
[sessionManager setResponseSerializer:[AFJSONResponseSerializer serializer]]; 
[sessionManager setRequestSerializer:[AFJSONRequestSerializer serializer]]; 

[sessionManager GET:urlString 
    parameters:nil 
    success:^(NSURLSessionDataTask *task, id responseObject) { 

     self.navigationItem.titleView = nil; 
     self.data = [responseObject objectForKey:@"courses"]; 
     self.title = responseObject[@"meta"][@"ref_title"]; 

    [self.tableView reloadData]; 
    } 
    failure:^(NSURLSessionDataTask *task, NSError *error) { 
     NSString *errorString = [NSString stringWithFormat:@"%@", 
           [error localizedDescription]]; 
     [aiView stopAnimating]; 
    }]; 

문제는 매번 데이터를로드하고 싶지 않다는 점입니다. 그래서 나는이 빠른 사용자 경험을 할 수 있습니다,하지만 지금은 문제가 데이터가 삭제되지 않습니다이다, 또는 그것이

sessionManager.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataElseLoad; 

사용? 따라서 사용자는 새로운 데이터가 있음을 알지 못할 수도 있습니다.

나는 응용 프로그램이로드 될 때 시작하는 순간 NSTimer에서 사용이 들어

후 나는이 데이터가 5로드 된 경우에도 메소드를 호출 타이머와 같은 아주 나쁜 솔루션입니다 생각

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 

호출 몇 초 전. 그래서 나는 더 좋은 것이 있는지 묻습니다.

여기에도 비슷한 질문이 있지만 이미지 캐시를 지우는 데 대한 것이므로 캐시의 나이는 없습니다. 가장 좋은 경우는 하루가 바뀔 때 캐시를 삭제할 수 있는지 여부입니다.

답변

0

다른 캐싱 정책을 살펴 보셨습니까? NSURLRequestReloadRevalidatingCacheData는 사용자의 요구에 더 적합 할 수있는 것처럼 보입니다. 원본 소스가 데이터가 여전히 유효 함을 확인한 경우에만 캐시 데이터를 사용합니다.

+0

예 시도해 볼 때마다 서버에서 다시로드됩니다. – Pahnev

+0

5 초 전에 캐시 된 데이터를 제거하지 않으려면 다음을 사용할 수 있습니다. (void) removeCachedResponseForRequest : (NSURLRequest *) request. 동일한 요청 인 경우 동일한 요청의 인스턴스가 두 번 이상있을 수 있습니다. – Kerstin

0

그럼 didFinishLaunchingWithOptions 응용 프로그램에서 날짜 확인을하고 NSUserDefaults에 날짜를 저장하기로했습니다. 따라서 날짜가 맞지 않으면 NSUserDefaults의 모든 캐시와 저장된 값을 지우도록 설정했습니다.

코드를 올바르게 이해하면 사용자가 다음 날 앱을 시작한 경우에만 모든 정보가 삭제되어야합니다. 이는 나에게 가장 적합합니다.

NSDate *dateCheck = [NSDate date]; 

NSDate *saveDate = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastStartDate"]; 
if (!saveDate) { 
    // This is the 1st run of the app 
    saveDate = [NSDate date]; 

    [[NSUserDefaults standardUserDefaults] setObject:saveDate forKey:@"lastStartDate"]; 
} 
NSLog(@"First run was on: %@", saveDate); 

NSInteger interval = [[[NSCalendar currentCalendar] components:NSCalendarUnitDay 
                 fromDate:saveDate 
                 toDate:dateCheck 
                 options:0] day]; 
if (interval < 0 || interval > 0) { 
    // Dates don't match lets remove cache and delete saveDate 
    [self removeAllCachedResponses]; 
    NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; 
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain]; 
} else { 
    // Dates are equal no need to do anything 
    NSLog(@"dates are same"); 
} 

나는 알 수 있듯이 NSUserDefaults에서 모든 것을 삭제합니다. 다른 용도로 사용하지는 않습니다. 당신이 그것을 바꿀 수도 있습니다.

편집 : 잘 바뀌 었으므로 실제로 작동하는지 확인하기로했습니다. 대답은 '아니오'입니다. 내 기록은 여기

2014-09-10 16:00:30.626 SodexoMenuApp[4283:607] datecheck: 2014-09-10 21:00:30 +0000 
2014-09-10 16:00:30.627 SodexoMenuApp[4283:607] First run was on: 2014-09-09 23:02:02 +0000 

그래서 뭔가가 변경되어야합니다. 어떤 아이디어?

편집 2 : 나는 이것을 풀 었다고 생각한다. 구성 요소를 변경해야만했습니다. NSCalendarUnitDay

관련 문제