2012-07-05 3 views
2

포 스퀘어 API에서 내 아이폰 앱으로 데이터를 가져 오는 데 RestKit을 사용하고 있지만 중첩 된 객체에 대한 후속 API 호출에 문제가 있습니다. 특히iOS에서 RestKit - 중첩 된 객체에 대한 후속 API 호출?

는 :

  1. 나는 개최지 검색 API는 (https://developer.foursquare.com/docs/venues/search) 개최 장소의 목록을 검색하기 위해 호출합니다. 각 Venue에는 응답에 포함 된 고유 한 ID가 있습니다. 나는 나의의 ViewController에서 다음과 같이이 작업을 수행 :

    [objectManager loadObjectsAtResourcePath:[NSString stringWithFormat:@"%@?%@", [URL resourcePath], [URL query]] delegate:self]; 
    
  2. 내가 다음 RestKit 매핑 등을하고 데이터 배열의 개최지를 저장합니다. 여기까지 잘 작동하는 모든 것.

  3. 이 시점에서 데이터 배열의 Venues를 반복하며 각 Venue에 대한 자세한 정보를 검색하기 위해 후속 API 호출을 수행해야합니다. 각 Venue에 대해 고유 ID를 사용하고 Venue 세부 API (https://developer.foursquare.com/docs/venues/venues)를 호출합니다. 이 부분은 나를 괴롭히는 부분입니다. 이 두 번째 API 호출에서 반환 된 Photo 개체의 NSArray를 가져 오려고합니다. 이 중 지금까지 내가 시도 변동 :

    for (id venue in self.data){ 
        Venue *myvenue = (Venue *)venue; 
        RKURL *URL = [RKURL URLWithBaseURL:[objectManager baseURL] resourcePath:[NSString stringWithFormat:@"/venues/%@", myvenue.venueid] queryParameters:queryParams]; 
        [objectManager loadObjectsAtResourcePath:[NSString stringWithFormat:@"%@?%@", [URL resourcePath], [URL query]] delegate:self]; 
    } 
    

    내 매핑 :

    @property (strong, nonatomic) NSArray *photos; 
    

Venue.photos 항상 반환 :

RKObjectMapping *photosMapping = [RKObjectMapping mappingForClass:[Photo class]]; 
[photosMapping mapKeyPathsToAttributes:@"url", @"imageURL", nil]; 
[venueMapping mapRelationship:@"photos" withMapping:photosMapping]; 
[objectManager.mappingProvider setMapping:photosMapping forKeyPath:@"response.photos"]; // not sure if this keypath is for the second API call 

내 장소 클래스는이있다 빈. 어떤 제안?

답변

0

이것이 최선의 방법인지 확실하지 않습니다. ,하지만 결국 끝내야 해. 장소와 사진을 매핑하지 않는 것에 대한 Paul de Lange의 의견은 올바른 경로로 나를 올바르게 설정했습니다.

네 스퀘어 응답이 내 앱에서 요구하는 형식이 아니므로 RKObjectLoader의 willMapData를 사용하여 나머지 매핑 작업을 수행하기 전에 응답을 약간 수정해야했습니다. 여기

그것은 경우에 미래에 사람을하는 데 도움이된다

- (void)objectLoader:(RKObjectLoader *)loader willMapData:(inout id *)mappableData { 
    NSArray* origPhotosArray = [*mappableData valueForKeyPath:@"response.venue.photos.groups"]; 
    NSMutableArray* newPhotosArray = [[NSMutableArray alloc] init]; 

    // <snip> Some extra code goes here where I discarded photos I did not want.... </snip> 

    // Create copies of objects in the format that I want 
    NSMutableDictionary *myphoto = [[NSMutableDictionary alloc] initWithDictionary:Photo]; 
    NSString *venueID = [*mappableData valueForKeyPath:@"response.venue.id"]; 
    [myphoto setObject:venueID forKey:@"assignedVenueid"]; 
    [newPhotosArray addObject:myphoto]; 

    // Replace the new objects instead of the response objects 
    [*mappableData removeObjectForKey:@"response.venue.photos.groups"];  
    [*mappableData setObject:newPhotosArray forKey:@"response.venue.photos.groups"]; 

} 

그리고 내 매핑 :

RKManagedObjectMapping *photosMapping = [RKManagedObjectMapping mappingForClass:[Photo class] inManagedObjectStore:objectStore]; 
[photosMapping mapKeyPath:@"url" toAttribute:@"imageURL"]; 
[photosMapping mapKeyPath:@"assignedVenueid" toAttribute:@"assignedVenueid"]; 
[venueMapping mapRelationship:@"photos" withMapping:photosMapping]; 
[objectManager.mappingProvider setMapping:photosMapping forKeyPath:@"response.venue.photos.groups"]; 
[photosMapping hasOne:@"assignedVenue" withMapping:venueMapping]; 
[photosMapping connectRelationship:@"assignedVenue" withObjectForPrimaryKeyAttribute:@"assignedVenueid"];  
0

게시 한 코드에서 응답을 장소와 연결하는 곳이 없습니다. 정사각형으로 반환 된 정확한 JSON에 대해서는 확신 할 수 없지만 중첩 된 사진 객체가있는 장소 매핑을 사용하여 매핑하는 방법을 알아야합니다. foursquare가 응답에서 원래 Venue 객체에 대한 참조를 반환하지 않으면 RKObjectLoader의 targetObject 속성을 Venue (코드의 myVenue)로 설정해 볼 수 있습니다.

+0

감사 폴, 당신은 사진 응답은 연결되지 않은 한 그 권리 어디서나 장소. 맵핑을 수정 한 후에 작동 시키지만 RKObjectLoader의 targetObject 속성을 사용하지 않았습니다. 대신에 willMapData를 사용하여 정사각형 응답을 필요한 형식으로 수정했습니다. 곧 내가 어떻게했는지에 대한 대답을 추가 할 것입니다. –

관련 문제