2013-01-02 42 views
8

我正在學習RESTKit,並且我正在跟隨this教程,這是根據以前版本的RESTKit,並且很多已在v0.20.0中更改,所以我正在閱讀有關新版本和在教程中執行相同的任務。RESTKit的問題,無法正確映射

現在映射存在一個問題,我花了很多時間沒有成功。我得到的錯誤是:

error: Error Domain=org.restkit.RestKit.ErrorDomain Code=1001 "No response descriptors match the response loaded." UserInfo=0x758d320 {NSErrorFailingURLStringKey=https://api.foursquare.com/v2/venues/search?client_id=<client id>&client_secret=KYHQHRYJ4PYFJYEG1F1IQVLQDM4G1HZ1STB2O1VUVUVQZBGS<client secret>&ll=37.33,-122.03&query=coffee&v=20120602, NSLocalizedFailureReason=A 200 response was loaded from the URL 'https://api.foursquare.com/v2/venues/search?client_id=<client id>&client_secret=<client secret>&ll=37.33,-122.03&query=coffee&v=20120602', which failed to match all (1) response descriptors: 
    <RKResponseDescriptor: 0x9566a60 baseURL=https://api.Foursquare.com/v2/ pathPattern=(null) statusCodes=200-299> failed to match: response URL 'https://api.foursquare.com/v2/venues/search?client_id=<client id>&client_secret=<client secret>&ll=37.33,-122.03&query=coffee&v=20120602' is not relative to the baseURL 'https://api.Foursquare.com/v2/'., NSLocalizedDescription=No response descriptors match the response loaded., keyPath=null, NSErrorFailingURLKey=https://api.foursquare.com/v2/venues/search?client_id=<client id>&client_secret=<client secret>&ll=37.33,-122.03&query=coffee&v=20120602, NSUnderlyingError=0x758d3a0 "No mappable object representations were found at the key paths searched."} 

Venue.h是:

#import <Foundation/Foundation.h> 

@interface Venue : NSObject 

@property (strong, nonatomic) NSString *name; 

@end 

Venue.m是:

#import "Venue.h" 

@implementation Venue 
@synthesize name; 

@end 

,我在MasterViewController.m在ViewDidAppear方法做的一切,即:

- (void) viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    NSURL *baseURL = [NSURL URLWithString:@"https://api.Foursquare.com/v2"]; 

    AFHTTPClient * client = [AFHTTPClient clientWithBaseURL:baseURL]; 
    [client setDefaultHeader:@"Accept" value:RKMIMETypeJSON]; 

    RKObjectManager *objectManager = [[RKObjectManager alloc] initWithHTTPClient:client]; 

    RKObjectMapping *venueMapping = [RKObjectMapping mappingForClass:[Venue class]]; 
    [venueMapping addAttributeMappingsFromDictionary:@{ 
    @"name" : @"name" 
    }]; 

    RKResponseDescriptor * responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:venueMapping 
                         pathPattern:nil 
                          keyPath:@"response.venues" 
                         statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
    [objectManager addResponseDescriptor:responseDescriptor]; 

    NSString *latLon = @"37.33,-122.03"; 
    NSString *clientID = [NSString stringWithUTF8String:kCLIENTID]; 
    NSString *clientSecret = [NSString stringWithUTF8String:kCLIENTSECRET]; 

    NSDictionary *queryParams; 
    queryParams = [NSDictionary dictionaryWithObjectsAndKeys:latLon, @"ll", clientID, @"client_id", clientSecret, @"client_secret", @"coffee", @"query", @"20120602", @"v", nil]; 
    //NSLog(@"object manager: %@ - %@", objectManager.baseURL, [[objectManager responseDescriptors] objectAtIndex:0]); 

    /* 
    RKRelationshipMapping* relationShipMapping = [RKRelationshipMapping relationshipMappingFromKeyPath:@"venues" 
                          toKeyPath:@"venues" 
                          withMapping:venueMapping]; 
    [venueMapping addPropertyMapping:relationShipMapping]; */ 
    [objectManager getObjectsAtPath:@"https://api.Foursquare.com/v2/venues/search" 
         parameters:queryParams 
         success:^(RKObjectRequestOperation * operaton, RKMappingResult *mappingResult) 
         { 
          NSLog(@"success: mappings: %@", mappingResult); 
         } 
         failure:^(RKObjectRequestOperation * operaton, NSError * error) 
         { 
          NSLog (@"failure: operation: %@ \n\nerror: %@", operaton, error); 
         }]; 

} 

我hav e在瀏覽器中檢查了響應,並且沒問題,但出於某種原因,我做的任何事都沒有擺脫錯誤。我陷入了映射的第一步,無法前進。所有關於這個主題在互聯網上的例子和文件都過時了,沒有RESTkit的舊版本的經驗,我無法弄清楚。請告訴我做錯了什麼。

使用xcode 4.5和iOS6版本。

響應中心(在瀏覽器中選中):

{"meta":{"code":200},"response":{"venues":[{"id":"4f482132e4b0f85d07c34cb5","name":"De Anza 3 Coffee Bar","contact":{},"location":{"address":"10500 De Anza Blvd","lat":37.329438,"lng":-122.03083,"distance":96,"postalCode":"95014","city":"Cupertino","state":"CA","country":"United States","cc":"US"},"canonicalUrl":"https:\/\/foursquare.com\/v\/de-anza-3-coffee-bar\/4f482132e4b0f85d07c34cb5","categories":[{"id":"4bf58dd8d48988d1e0931735","name":"Coffee Shop","pluralName":"Coffee Shops","shortName":"Coffee Shop","icon":{"prefix":"https:\/\/foursquare.com\/img\/categories\/food\/coffeeshop_","sizes":[32,44,64,88,256],"name":".png"},"primary":true}],"verified":false,"restricted":true,"stats":{"checkinsCount":1,"usersCount":1,"tipCount":0},"likes":{"count":0,"groups":[]},"specials":{"count":0,"items":[]},"hereNow":{"count":0,"groups":[]},"referralId":"v-1357121711"},{"id":"40ccea80f964a52019011fe3","name":"Coffee Society","contact":{"phone":"4087258091","formattedPhone":"(408) 725-8091"},"location":{"address":"21265 Stevens Creek Blvd","crossStreet":"at Oaks Shopping Center","lat":37.32330342,"lng":-122.047382,"distance":1709,"postalCode":"95014","city":"Cupertino","state":"CA","country":"United States","cc":"US"},"canonicalUrl":"https:\/\/foursquare.com\/v\/coffee-society\/40ccea80f964a52019011fe3","categories":[{"id":"4bf58dd8d48988d1e0931735","name":"Coffee Shop","pluralName":"Coffee Shops","shortName":"Coffee Shop","icon":{"prefix":"https:\/\/foursquare.com\/img\/categories\/food\/coffeeshop_","sizes":[32,44,64,88,256],"name":".png"},"primary":true}],"verified":false,"restricted":true,"stats":{"checkinsCount":2536,"usersCount":869,"tipCount":24},"likes":{"count":0,"groups":[]},"specials":{"count":0,"items":[]},"hereNow":{"count":0,"groups":[]},"referralId":"v-1357121711"}, ..... 

回答

12

我嘗試將完全相同的教程轉換爲0.20版本,最後我爲URL修改了URL(https://api.Foursquare.com/v2)。用大寫字母f替換大寫字母'F',所有字母都是小寫字母。看來RESTKit期望所有小寫,並區分大小寫,但我是iOS編程和RESTkit的新手。

還要注意:

  1. 無需RKRelationshipMapping東西
  2. pathPattern:無& 的keyPath:@ 「response.venues」

我相信你有這些了,但我想爲了以防萬一。

+0

非常感謝,我從來沒有想到這會成爲問題,也感謝將教程轉換爲v0.20的努力! – SpeedBirdNine

+0

@Tilo我們在哪裏可以找到您的轉換教程?這會有所幫助。 – Danny

0

您是否嘗試過的keyPath爲簡單的 「場地」,而不是 「response.venues」?

+0

是的,沒有成功。 – SpeedBirdNine

0

既然你已經使用了與基本URL您的自定義HTTP客戶端,請嘗試使用人的路延伸:

[objectManager getObjectsAtPath:@"/venues/search" 
        parameters:queryParams 
        success:^(RKObjectRequestOperation * operaton, RKMappingResult *mappingResult) 
        { 
         NSLog(@"success: mappings: %@", mappingResult); 
        } 
        failure:^(RKObjectRequestOperation * operaton, NSError * error) 
        { 
         NSLog (@"failure: operation: %@ \n\nerror: %@", operaton, error); 
        }]; 

而且也是你的響應描述添加路徑:

RKResponseDescriptor * responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:venueMapping 
                        pathPattern:@"/venues/search" 
                         keyPath:@"venues" 
                        statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
+0

試過這個,沒有成功。我已經構建了這個和其他幾個例子,可以使用老版本的RestKit(0.10。x)但由於某種原因,我無法使用最新版本的工作。 – SpeedBirdNine