मैं उस एप्लिकेशन के लिए RestKit का उपयोग करना चाहता हूं जिसे ऑन और ऑफ़लाइन दोनों काम करने की आवश्यकता है।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
मैं तो पथ "/ API/उपयोगकर्ताओं/123" में, सर्वर के लिए एक कॉल आईडी 123 के साथ उपयोगकर्ता पाने के लिए करते हैं:
User* user = [User object];
user.identifier = [NSNumber numberWithInt:123];
RKObjectManager* manager = [RKObjectManager sharedManager];
[manager getObject:user delegate:self];
यह ठीक काम करता है। लेकिन, जब मैं अपने मैक पर वाईफाई को डिस्कनेक्ट करता हूं, तो उपरोक्त कोड उपयोगकर्ता को SQLite डेटाबेस से पुनर्प्राप्त नहीं करता है।
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", मैं उम्मीद है |
मैं बजाय में प्रतिनिधि के objectLoader:didFailWithError
निम्नलिखित त्रुटि मिलती है स्थानीय कैश से उपयोगकर्ता को पुनर्प्राप्त किया जाएगा।
कैश में Z 123ER के साथ उपयोगकर्ता रिकॉर्ड होता है - ZUSER तालिका में, ZIDENTIFIER कॉलम में 123 के साथ।
क्या कोई ऐसा कदम है जिसे मैं काम करने के लिए याद कर रहा हूं? हो सकता है कि को टाइमआउट के बाद कैश मारा जाता है, तो को संभालने की आवश्यकता है या कहा जाता है? या क्या मैं ऐसा कुछ करने की कोशिश कर रहा हूं जो आवश्यक नहीं है जिसे आप "बॉक्स से बाहर" प्राप्त कर सकें?
चीयर्स।
हाय , मैं RestKit 0.20.1 के साथ ऐसा करने की कोशिश कर रहा हूं - इस पर कोई अपडेट? क्या आपको यह काम मिल गया? आपके द्वारा चेक किया गया उत्तर आपके प्रश्न का उत्तर नहीं देता है ... धन्यवाद! – Diego
मैंने नीचे दिए गए उत्तर को सही के रूप में चेक किया क्योंकि मैंने जूलियन के एक पहुंच योग्यता वर्ग का उपयोग करने का सुझाव लिया ताकि यह जांच सके कि मैं ऑनलाइन या ऑफ़लाइन था या नहीं। बाद में मैंने ऑनलाइन संचार के लिए रेस्टकिट का उपयोग करके समाप्त किया, और कोरडाटा स्वयं ऑफ़लाइन स्टोरेज के लिए समाप्त हो गया। – dbarros
ठीक है धन्यवाद! मुझे लगता है कि मैं इसे एपडिलेगेट में केंद्रीकृत करने की कोशिश करूंगा - हालांकि ऐसा करने के लिए मुझे लगता है कि अगर मैं एक HTTP ऑपरेशन कतार बनाता हूं तो बेहतर होता है कि मैं हर बार सिंक की आवश्यकता होती है (संभवतः समय-समय पर)। – Diego