2

RailsでサポートされているAPIを指す単純なクライアントアプリケーションがあります。次のように非管理対象オブジェクトを取得します。

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

私が直面している問題は、応答が304 Not Modifiedであるため、RestKitが更新後にマッピングを実行しないことです。

ただし、operation.HTTPRequestOperation.responseDataを調べるときにJSONペイロードがあります。応答が304NotModifiedの場合でも、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 を追加する必要があります。別のオプションは、RestKit 0.20 では簡単ではない NSURLCaching を無効にすることです。次のコードを使用します。

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

私は同じ問題を抱えています。さらに悪いことに、サーバーのステータス コードが実際には 304 ではなく 200 になっています。私は0.20.0を実行しています。回避策があれば教えてください。

以下は、ステータス コードが 200 であるにもかかわらず、mappingResult が空であることを示しています。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) 
于 2013-04-25T23:44:29.133 に答える