2

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

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

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

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

4

2 回答 2

2

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

看起来在 RestKit 0.20 中缓存被完全重新设计(实际上它被删除了,看 github issue #209)。现在,当收到 NOT MODIFIED 响应时,它不会解析缓存的响应正文。相反,它尝试使用所谓的“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:...]
于 2013-02-28T06:41:56.823 回答
1

我遇到了同样的问题,更糟糕的是服务器状态码实际上是200而不是304。mappingResult也是null,实际数据可以在原始帖子中的operation.HTTPRequestOperation.responseData中找到。我正在运行 0.20.0。请让我知道是否有适合我的解决方法。

下面显示了即使状态码为 200 的 mappingResult 为空。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) 
于 2013-04-25T23:44:29.133 回答