2

RestKitを使用してFoursquareAPIからiphoneアプリにデータをプルしていますが、ネストされたオブジェクトのフォローアップ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. この時点で、データ配列内の会場をループし、フォローアップAPI呼び出しを行って、各会場に関する詳細を取得する必要があります。会場ごとに、一意のIDを使用して、会場詳細API(https://developer.foursquare.com/docs/venues/venues)を呼び出します。これは私を困惑させる部分です。この2番目の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];
    }
    

    そして私のマッピングでは:

    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は常に空を返します。助言がありますか?

4

2 に答える 2

0

あなたが投稿したコードから、あなたはどこにも応答を会場にリンクしていません。foursquareによって返される正確なJSONについてはわかりませんが、ネストされた写真オブジェクトを持つ会場マッピングを使用してマッピングする方法を考案する必要があります。foursquareが応答で元のVenueオブジェクトへの参照を返さない場合は、RKObjectLoaderのtargetObjectプロパティをVenue(コード内のmyVenue)に設定してみてください。

于 2012-07-06T06:36:24.773 に答える
0

これが「最善の」方法であるかどうかはわかりませんが、最終的には機能しました。会場と写真をマッピングしないことについてのポール・デ・ランゲのコメントは、私を正しい道に正しく導きました。

foursquareの応答は、アプリで必要な形式ではなかったため、残りのマッピング操作の少し前に、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"];    
于 2012-07-10T07:15:02.013 に答える