2012-07-05 46 views
2

我正在使用RestKit將數據從Foursquare API拖入我的iphone應用程序,但遇到嵌套對象的後續API調用問題。iOS上的RestKit - 嵌套對象的後續API調用?

具體做法是:

  1. 我所說的場地搜索API(https://developer.foursquare.com/docs/venues/search)來檢索地點的完整列表。每個場館都有一個唯一的ID,包含在回覆中。我這樣做,在我的ViewController如下:

    [objectManager loadObjectsAtResourcePath:[NSString stringWithFormat:@"%@?%@", [URL resourcePath], [URL query]] delegate:self]; 
    
  2. 我那麼做RestKit映射等,並儲存場地的數據陣列。一切正常工作到這裏。

  3. 此時我循環訪問數據數組中的Venues,並且必須進行後續API調用才能檢索每個Venue的更多詳細信息。對於每個場館,我使用唯一的ID並呼叫Venue詳細API(https://developer.foursquare.com/docs/venues/venues)。這是困擾我的部分。我試圖從這個第二個API調用返回一個NSArray的Photo對象。這到目前爲止,我曾嘗試變化:

    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]; 
    } 
    

    ,並在我的映射:

    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 
    

    和我的場館類有這樣的:

    @property (strong, nonatomic) NSArray *photos; 
    

Venue.photos總是返回空。有什麼建議麼?

回答

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

從您發佈的代碼中,您無法將響應與場地鏈接起來。我無法確定foursquare返回的確切JSON,但您需要設想一種使用具有嵌套照片對象的場地地圖進行地圖繪製的方法。如果foursquare在它的響應中沒有返回對原始Venue對象的引用,你可以嘗試將RKObjectLoader的targetObject屬性設置爲Venue(你的代碼中的myVenue)

+0

謝謝保羅,你的權利,這些照片反應是不掛了場地。我修改了映射後得到了它的工作,但是沒有使用RKObjectLoader的targetObject屬性,但是我使用了willMapData來將foursquare響應修改爲我需要的格式。我將很快就會做出答案。 – 2012-07-10 07:06:49