我想爲需要在離線和離線狀態下工作的應用程序使用RestKit。RestKit iOS應用程序的在線和離線支持
我可能會誤解RestKit的工作方式,但我認爲這是相當容易實現的。
在劃痕試驗iOS應用餘設置的東西,如下:根據需要CoreData支持
// setup the client
NSString* URL = @"http://10.211.55.5:3000/api";
RKClient* client = [RKClient clientWithBaseURL:URL];
client.username = @"[email protected]";
client.password = @"password";
// setup caching
client.cachePolicy = RKRequestCachePolicyLoadIfOffline | RKRequestCachePolicyLoadOnError | RKRequestCachePolicyTimeout;
client.requestCache.storagePolicy = RKRequestCacheStoragePolicyPermanently;
// setup managed object store
RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:URL];
RKManagedObjectStore* objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"RestKitCoreDataTest.sqlite"];
// connect my cache implementation
MyCache* cache = [[MyCache alloc] init];
objectStore.managedObjectCache = cache;
objectManager.objectStore = objectStore;
// setup mapping
RKManagedObjectMapping* userMapping = [RKManagedObjectMapping mappingForClass:[User class]];
[userMapping mapKeyPath:@"id" toAttribute:@"identifier"];
[userMapping mapKeyPath:@"email" toAttribute:@"email"];
[userMapping mapKeyPath:@"firstname" toAttribute:@"firstname"];
[userMapping mapKeyPath:@"surname" toAttribute:@"surname"];
userMapping.primaryKeyAttribute = @"identifier";
[objectManager.mappingProvider setMapping:userMapping forKeyPath:@""];
// setup routes
RKObjectRouter* router = [objectManager router];
[router routeClass:[User class] toResourcePath:@"https://stackoverflow.com/users/:identifier"];
用戶對象被實現:
@interface User : NSManagedObject
@property (nonatomic, retain) NSNumber * identifier;
@property (nonatomic, retain) NSString * email;
@property (nonatomic, retain) NSString * firstname;
@property (nonatomic, retain) NSString * surname;
@end
@implementation User
@dynamic identifier;
@dynamic email;
@dynamic firstname;
@dynamic surname;
@end
這裏是MyCache。請注意,我並不打算檢查resourcePath
,因爲這僅僅用於試用,而且我有一條路徑。
@implementation MyCache
- (NSArray*)fetchRequestsForResourcePath:(NSString*)resourcePath
{
NSFetchRequest* fetchRequest = [User fetchRequest];
return [NSArray arrayWithObject:fetchRequest];
}
-(BOOL)shouldDeleteOrphanedObject:(NSManagedObject *)managedObject
{
return true;
}
@end
我然後對服務器的呼叫ID爲123來獲得用戶,在路徑 「/ API /用戶/ 123」:
User* user = [User object];
user.identifier = [NSNumber numberWithInt:123];
RKObjectManager* manager = [RKObjectManager sharedManager];
[manager getObject:user delegate:self];
這工作得很好。但是,當我斷開我的Mac上的WiFi時,上面的代碼不會從sqlite數據庫中檢索用戶。
我收到以下錯誤,而不是在代理的objectLoader:didFailWithError
:
2012-03-01 11:44:09.402 RestKitCoreDataTest[1989:fb03] error: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo=0x6b89aa0 {NSErrorFailingURLStringKey=http://10.211.55.5:3000/api/users/123, NSErrorFailingURLKey=http://10.211.55.5:3000/api/users/123, NSLocalizedDescription=The request timed out., NSUnderlyingError=0x6b81ac0 "The request timed out."}
心想:「RKRequestCachePolicyTimeout」,我本來期望用戶將從本地緩存中檢索。
緩存確實包含ID 123的用戶記錄 - 在ZUSER表中,在ZIDENTIFIER列中包含123。
有沒有一個步驟,我錯過了這個工作?也許 需要處理或調用另一個委託方法,當超時時間後 超時後命中緩存?或者我正在嘗試做什麼,這不一定是你用RestKit「開箱即用」的東西?
乾杯。
喜,我正在嘗試使用RestKit 0.20.1來做同樣的事情 - 對此有何更新?你有這個工作嗎?你檢查的答案似乎並沒有回答你的問題......謝謝! – Diego 2013-05-23 15:11:03
我檢查了下面的答案是正確的,因爲我採取了朱利安的建議,使用可達性類來檢查我是在線還是離線。後來,我最終使用RestKit進行在線通信,並將CoreData本人用於離線存儲。 – dbarros 2013-05-24 23:29:32
好的,謝謝!我想我會嘗試在appdelegate中集中這一點 - 雖然爲了做到這一點,我認爲如果我創建一個HTTP操作隊列,然後我每次需要同步解析(可能定期),會更好。 – Diego 2013-05-31 13:59:08