【问题标题】:RestKit 0.10.0 with foursquare API's not retrieving the response when using blocks带有foursquare API的RestKit 0.10.0在使用块时不检索响应
【发布时间】:2013-05-12 18:29:14
【问题描述】:

嗯,RestKit 的初学者,我的第一个例子是在foursquare API 上,我使用的是带有块而不是委托的RestKit。

我想检索场地名称,这是 JSON 响应

这是我的代码:

// App Delegate.m

    RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURLString:@"https://api.Foursquare.com/v2"];
RKManagedObjectStore *objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"Venue.sqlite"];
objectManager.objectStore = objectStore;
objectManager.serializationMIMEType = RKMIMETypeJSON;
RKManagedObjectMapping *venueMapping = [RKManagedObjectMapping mappingForClass:[Venue class] inManagedObjectStore:objectStore];

[venueMapping mapKeyPath:@"id" toAttribute:@"id"];
[venueMapping mapKeyPath:@"name" toAttribute:@"name"];
venueMapping.primaryKeyAttribute = @"id";

[objectManager.mappingProvider setMapping:venueMapping forKeyPath:@"response.venue"];

然后在 myViewController.m 中

-(void)loadVenues{

// When caling loadObjectsAtResourcePath method it specify RKObjectLoader which is the actual request.
// within these block you can take more options to controll the request.


[[RKObjectManager sharedManager]loadObjectsAtResourcePath:@"/venues/40a55d80f964a52020f31ee3?oauth_token=FNQPN5P5EKLJ5IQ44TMWO00I3W033M0Y1TKINW2OTF2VIOTP&v=20130512" usingBlock:^(RKObjectLoader* loader)
{
    loader.objectMapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:[Venue class]];
    loader.onDidLoadObject = ^(NSArray *objects)
    {
        NSLog(@"onDidLoadObject Blocks");
        self.data = objects;
        [self.tableView reloadData];
    };
}
 ];

}

并且应用程序正在进入 onDidLoadObject 块但每次数组为空! 即使我在浏览器上测试链接,它也会附带数据。

当我调试 loader.URL 时,它总是带有这些

https://api.Foursquare.com/v2/venues/40a55d80f964a52020f31ee3?v=20130512&oauth_token=FNQPN5P5EKLJ5IQ44TMWO00I3W033M0Y1TKINW2OTF2VIOTP -- https://api.Foursquare.com/v2 -- https://api.Foursquare.com/v2

不知道为什么 load.URL 出错了?!

我认为嗯以错误的方式调用 4square API,有人可以帮忙吗? :)

【问题讨论】:

    标签: ios json restkit objective-c-blocks foursquare


    【解决方案1】:

    -将您的映射作为一个类方法从所有应用程序类中访问,并且只执行一次。

    -更改属性“id”,因为它在 Objective-C 中保留。

    -将此添加到块中

    [loader setObjectMapping:[RestKitMapping yourMapping]];
    

    -然后将其添加到您的映射代码中

    [objectManager.mappingProvider setMapping:venueMapping forKeyPath:@"response.venue"];
    

    -并使用委托而不是块

    【讨论】:

    • RestKit 0.10.0 中的 Blocks 存在问题,你说得对,当我使用委托而不是 Blocks 时它起作用了。
    【解决方案2】:

    我对上述代码有两个担忧:

    1- 显然,上面的 JSON 响应只列出了一个 Venue .. 所以 KeyPath 应该是“response.venue”而不是“response.venues”

    2- ID 的映射在哪里? .. 哪个是 RestKit 用于插入数据库的主键?您需要设置主键映射。

    【讨论】:

    • - 你说得对,RestKit 0.10.0 中的 Blocks 存在问题,当我使用委托而不是 Blocks 时它起作用了。 - setObjectMapping:venueMapping 而不是 setMapping:venueMapping。 - 要保存在数据库中,您必须告诉 RestKit 什么是数据模型中的主键,它应该是正确的,而不是像我制作的 id,如果您不这样做,它将起作用并且响应会出现但不会保存coredate 这是 RestKit 中最重要的一点:)。谢谢 Shady 和 Goharey :)
    猜你喜欢
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2013-11-11
    相关资源
    最近更新 更多