2014-06-17 4 views
3

내 앱은 메시징 스타일 앱이며 다른 앱에 "태그 지정"할 수 있습니다. (조금 트위터처럼).캐싱 PFFile 데이터를 구문 분석에서

이제이 메시지가 표시되면 태그 된 사람의 아바타가 해당 메시지와 함께 표시됩니다.

사용자의 아바타는 PFUser 개체에 대해 PFFile로 저장됩니다. 나는 그것을 이런 식으로 뭔가를로드하고있어

...

PFImageView *parseImageView = ... 

[taggedUser fetchIfNeededInBackgroundWithBlock:^(PFObject *user, NSError *error) { 
    parseImageView.file = user[@"avatar"]; 
    [parseImageView loadInBackground]; 
}]; 

이 모두 잘 작동합니다.

코드의 필요한 부분은 대개 사용자 데이터가 캐시 된 대부분의 시간 동안 네트워크에 닿지 않습니다.

그러나 이미지를 가져 와서 이미지보기에 넣는 배경 부분의로드는 매번 실행됩니다. PFFile 데이터에는 캐싱이 전혀없는 것 같습니다.

동일한 사용자의 아바타를 여러 번 다운로드 한 후에도 네트워크에 연결되는 경우가 많습니다.

이 데이터를 캐시에 저장하는 방법이 있습니까? 아니면이 방법을 직접 구현해야합니까?

+0

거의 동일한 문제가 있습니다. 캐시 정책 중 하나를 사용하고 있지만 몇 가지 단점이 있습니다. Anypic의 코드를 확인하면 다른 고급 솔루션을 볼 수 있으며 좋아하고 댓글에 사용했지만 나에게는 어려움이있었습니다. – rihe

+0

@ vv88 고마워, 내가 어떤 그림 소스 코드 좀 살펴 보겠습니다. – Fogmeister

답변

-1

아래 코드와 같이 PFQuery의 결과를 캐싱 할 수 있습니다. 백그라운드에서 개체를 찾지 않고 캐시를 확인해야합니다. 이미지를 검색하는 동안 캐시를 확인해야합니다. 다른 캐시 정책도 있습니다. 첨부 된 링크도 확인하십시오.

PFQuery *attributesQuery = [PFQuery queryWithClassName:@"YourClassName"]; 
attributesQuery.cachePolicy = kPFCachePolicyCacheElseNetwork; //load cache if not then load network 
if ([attributesQuery hasCachedResult]){ 
    NSLog(@"hasCached result"); 
}else{ 
    NSLog(@"noCached result"); 
} 

출처 : https://parse.com/questions/hascachedresult-always-returns-no

이 희망 그것은 .... 당신이하는 데 도움이!

+0

감사하지만 문제는 아닙니다. 문제는 개체에 포함 된 PFFile의 데이터입니다. – Fogmeister

0

마지막으로 나는 NSCache의 싱글 톤을 생성하고 Parse로 가기 전에이 쿼리를 쿼리했습니다.

지금은 빠른 응답으로 작동합니다. 물론, 그것은 각각의 새로운 세션이 모든 이미지를 다시 다운로드해야한다는 것을 의미합니다. 그러나 그것은 지금보다 훨씬 좋았습니다.

@property (assign, readonly) BOOL isDataAvailable 

경우 :

PFQuery *query = [PFQuery queryWithClassName:@"MyClass"]; 
query.cachePolicy = kPFCachePolicyCacheThenNetwork; 

가 PFFile이 로컬 캐시에 사용되는지 확인하려면 : 이전 PFQuery 캐싱 정책을 사용하는 경우

6

PFFile 자동으로 같은, 당신을 위해 파일을 캐시합니다 예 :

PFFile *file = [self.array objectForKey:@"File"]; 
if ([file isDataAvailable]) 
{ 
    // no need to do query, it's already there 
    // you can use the cached file 
} else 
{ 
    [file getDataInBackgroundWithBlock:^(NSData *data, NSError *error) 
    { 
     if (!error) 
     { 
      // use the newly retrieved data 
     } 
    }]; 
} 

그것을 희망 도움이 :)

관련 문제