2013-09-03 2 views
-2

그래서 나는 parse.com에 여러 개체를 가지고 있습니다. 클래스 이름은 geoPoint라는 열에 지리적 포인트가있는 "MainInfo"입니다. 롤링 queryForTable내 쿼리가 작동하지 않는 이유를 이해할 수 없습니다.

[PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, NSError *error) { 
if (!error) { 
    self.userLocation = geoPoint; 
    [self loadObjects]; 
} 
}]; 

및 공연 :

@property (nonatomic, strong) PFGeoPoint *userLocation; 

는 그 다음의 viewDidLoad에 다음과 같은 추가 :

나는 내 .H 파일에 다음을 추가하여 사용자의 위치를 ​​얻고있다

- (PFQuery *)queryForTable 
{ 
// User's location 
PFGeoPoint *userGeoPoint = self.userLocation; 
// Create a query for places 
PFQuery *query = [PFQuery queryWithClassName:@"MainInfo"]; 
// Interested in locations near user. 
[query whereKey:@"geoPoint" nearGeoPoint:userGeoPoint]; 
// Limit what could be a lot of points. 
query.limit = 10; 
// Final list of objects 
_placesObjects = [query findObjects]; 

return query; 
} 

Xcode가 오류 *** setObjectForKey: object cannot be nil (key: $nearSphere)

을 제공합니다.

내가 제대로 작동하는지 확인하기 위해 내가 뭘 잘못하고 있는지 전혀 알지 못합니다.

나는 이것을 파서 문서와 함께 사용하여 지금까지이 문제를 해결했다. Here is a link

+0

'self.userLocation'은 (는) 시간에 업데이트 되었습니까? – Wain

+0

@Wain 아니요 업데이트되지 않았습니다. 어떻게 사용자 위치를 찾을 때까지 쿼리를 대기시킬 수 있습니까? – Shayno

답변

1

처음으로보기가로드 될 때 self.userLocation이 설정되지 않으므로 whereKey:nearGeoPoint:에 nil 값을 전달하기 때문에 오류가 발생합니다. 당신은이 일을 할 것입니다 : self.userLocation가 nil 일 경우 queryForTable 방법에서

  1. 확인합니다. 그럴 경우 nil을 리턴하십시오. 이것은 no-op로 작동하며 테이블에는 아직 데이터가 표시되지 않습니다. self.userLocation 값이 설정되면 귀하의 geoPointForCurrentLocationInBackground: 완료 블록에서

    - (PFQuery *)queryForTable 
    { 
        if (!self.userLocation) { 
         return nil; 
        } 
        // User's location 
        PFGeoPoint *userGeoPoint = self.userLocation; 
        // Create a query for places 
        PFQuery *query = [PFQuery queryWithClassName:@"MainInfo"]; 
        // Interested in locations near user. 
        [query whereKey:@"geoPoint" nearGeoPoint:userGeoPoint]; 
        // Limit what could be a lot of points. 
        query.limit = 10; 
        // Final list of objects 
        _placesObjects = [query findObjects]; 
    
        return query; 
    } 
    
  2. , 당신은 [self loadObjects]를 호출 할 것입니다. 그러면 PFQueryTableViewController에 다시 쿼리를 실행하게되며, 이번에는 self.userLocation 주위에 0이되지 않으므로 원래 쿼리를 구성 할 수 있습니다. 다행스럽게도 이미이 단계를 수행했지만 다른 사람이 같은 질문을하는 경우에 대비하여 여기에 포함 시켰습니다.

2

geoPointForCurrentLocationInBackground을 호출하면 완료 블록이 있습니다. 이 완료 블록은 테이블 뷰를 채우기 위해 필요한 정보가있는 지점을 표시합니다. 그렇지 않으면 오류가 있으며 다른 것을해야합니다. 따라서 완료 블록이 호출 될 때까지 쿼리 데이터를 테이블보기에 표시하거나로드해서는 안됩니다. 다른 말로하면 쿼리를 완료하는 데 필요한 정보가 없습니다.

대기중인 동안 활동 표시기를 표시 할 수 있습니다. 또는이보기를 표시하기 전에 userLocation을 얻는 것이 더 나을 수도 있으므로 여기에 도착했을 때 항상 쿼리 정보를 얻을 수 있습니다.

+0

어떻게 데이터를로드하기 전에 위치를 얻을 때까지 tableview 기다릴 것이라고? – Shayno

+1

'queryForTable'에서'nil'을 리턴 한 다음 실제 쿼리를 생성 할 수 있으면 완료 블록에서'reloadData'를 호출 할 수 있습니다. 이 방법이 완벽하게 작동하는지 확신 할 수 없으며,'nil'을 다루는 테이블 뷰에 의존합니다. – Wain

관련 문제