304 Not Not Modified后,RestKit 0.20.0-rc1 mappingResult为空

时间:2013-02-13 06:07:42

标签: ios api restkit

我有一个简单的客户端应用程序,指向Rails支持的API。它获取非托管对象,如下所示:

[[RKObjectManager sharedManager] getObjectsAtPath:@"places" params:nil success:...]

我面临的问题是RestKit在刷新后不执行任何映射,因为响应是304 Not Modified。

但是,在检查operation.HTTPRequestOperation.responseData时,有一个JSON有效负载。即使响应是304 Not Modified,我如何让restkit映射。

2 个答案:

答案 0 :(得分:2)

在我的项目中遇到同样的问题。

看起来像在RestKit 0.20缓存完全重做(实际上它被删除了,看github问题#209)。现在,当收到NOT MODIFIED响应时,它doesn't parse缓存了响应主体。相反,它尝试使用所谓的“RKFetchRequestBlock”从持久性存储加载对象。您可以在此处详细了解:http://restkit.org/api/latest/Classes/RKManagedObjectRequestOperation.html

因此,您需要为每个可以返回304响应的URL添加RKFetchRequestBlock。 另一种选择是禁用NSURLCaching,这在RestKit 0.20中并不重要。我使用以下代码:

ELObjectManager.h

@interface RKObjectManager ()
// So we can call [super requestWithMethod:...]
- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
                                      path:(NSString *)path
                                parameters:(NSDictionary *)parameters;

@end

@interface ELObjectManager : RKObjectManager
@end

ELObjectManager.m

#import "ELObjectManager.h"

@implementation ELObjectManager

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
                                      path:(NSString *)path
                                parameters:(NSDictionary *)parameters
{
    NSMutableURLRequest* request = [super requestWithMethod:method path:path parameters:parameters];
    request.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
    return request;
}

@end

然后使用此类而不是RKObjectManager

[RKObjectManager setSharedManager:[ELObjectManager managerWithBaseURL:...]

答案 1 :(得分:1)

我遇到了同样的问题,更糟糕的是服务器状态代码实际上是200而不是304. mappingResult也是null,并且可以在operation.HTTPRequestOperation.responseData中找到实际数据作为原始帖子说。我正在运行0.20.0。如果有解决方法,请告诉我。

以下显示mappingResult为空,即使状态代码为200. responseData太长而无法发布。我也在使用RestKit的核心数据集成。

2013-04-25 16:38:14.244 MyApp[58584:c07] I restkit.network:RKHTTPRequestOperation.m:185 GET 'http://localhost:3000/api/search?access_token=3ad3b8c4a5fed9503a80c1f6afebab47&keywords=art' (200 OK) [0.0047 s]
(lldb) po mappingResult
$0 = 0x079a1880 <RKMappingResult: 0xac64c80, results={
    "<null>" =     (
    );
}>
(lldb) po operation
$1 = 0x07995fd0 <RKManagedObjectRequestOperation: 0x7995fd0, state: Successful, isCancelled=NO, request: <NSMutableURLRequest http://localhost:3000/api/search?access_token=3ad3b8c4a5fed9503a80c1f6afebab47&keywords=art>, response: <NSHTTPURLResponse: 0x7e51fc0 statusCode=200 MIMEType=application/json length=58781>>
(lldb)