我有一个简单的客户端应用程序,它指向 Rails 支持的 API。 它获取非托管对象如下:
[[RKObjectManager sharedManager] getObjectsAtPath:@"places" params:nil success:...]
我面临的问题是 RestKit 在刷新后不执行任何映射,因为响应是 304 Not Modified。
但是,在检查
operation.HTTPRequestOperation.responseData
时,存在 JSON 有效负载。 即使响应为 304 Not Modified,我如何让 Restkit 进行映射。
在我的项目中遇到同样的问题。
看起来在 RestKit 0.20 中缓存被完全重新设计(实际上它被删除了,请观看 github 问题 #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:...]
我也遇到了同样的问题,更糟糕的是服务器状态代码实际上是200而不是304。mappingResult也是null,实际数据可以在操作中找到。HTTPRequestOperation.responseData,正如原始帖子所说。我正在运行0.20.0。如果有适合我的解决方法,请告诉我。
以下显示即使状态代码为 200,映射结果仍为空。responseData 太长,无法发布。我也在使用 RestKit 的 Core Data 集成。
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)