2014-05-18 46 views
0

我有兩個端點:RESTKit:兩個端點POST,PUT,DELETE

http://rest.domain.com/invite

http://rest.domain.com/template

根據用戶選擇,我需要能有什麼選擇,PUTPOST,& Delete在兩個終點上。

所有三種方法的映射略有不同。每個EndPoint的映射也不同。

什麼是設置映射的最佳方式,以便它們被加載一次,並且可以針對每個端點多次使用,具體取決於用戶選擇的選項(PUT,POSTDelete)?我必須在一個故事板上完成這個場景!

目前,下面是我當POST荷蘭國際集團的/invite端點使用的代碼(這第一篇文章後B/C我重新映射崩潰):

- (void)sendInvite:(NSInteger)methodType 
{ 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    self.objectManager = [self getObjectManager]; 
    self.objectManager.managedObjectStore = appDelegate.managedObjectStore; 
    RKEntityMapping *invitationMapping = [RKEntityMapping mappingForEntityForName:kInvite 
                  inManagedObjectStore:self.objectManager.managedObjectStore]; 

    RKEntityMapping *activityMapping = [RKEntityMapping mappingForEntityForName:kActivity 
                  inManagedObjectStore:self.objectManager.managedObjectStore]; 


    Invite *invitation; 

    switch (methodType) { 
     case POST: 
     { 
      invitationMapping = [RESTMappingProvider invitionPostMapping:invitationMapping]; 
      activityMapping = [RESTMappingProvider activityPostMapping:activityMapping]; 
      [invitationMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:kActivitiesRelationship 
                           toKeyPath:kActivitiesRelationship 
                          withMapping:activityMapping]]; 

      invitation = [self inviteForMethod:POST]; //This method just assigns values to the attributes 

      [self setupDescriptors:invitationMapping forKeyPath:kMeetupKeyPath descriptorClassIsTemplate:NO]; 
      [self.objectManager.HTTPClient registerHTTPOperationClass:[AFHTTPRequestOperation class]]; 
      [self.objectManager.managedObjectStore.mainQueueManagedObjectContext saveToPersistentStore:NO]; 

      [self.objectManager postObject:invitation path:kMeetupKeyPath parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
       [self removeDuplicateObjects]; //After removing relationship Dups, I save to persistent store 

      } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
      }]; 

     } 
      break; 
     case PUTACCEPT: 
     case PUTDECLINE: 
     case PUTEDIT: 
     { 
      invitationMapping = [RESTMappingProvider invitionPutMapping:invitationMapping]; 
      activityMapping = [RESTMappingProvider activityPutMapping:activityMapping]; 
      [invitationMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:kActivitiesRelationship 
                           toKeyPath:kActivitiesRelationship 
                          withMapping:activityMapping]]; 

      invitation = [self inviteForMethod:methodType]; //This method just assigns values to the attributes 

      [self setupDescriptors:invitationMapping forKeyPath:kMeetupKeyPath descriptorClassIsTemplate:NO]; 
      [self.objectManager.HTTPClient registerHTTPOperationClass:[AFHTTPRequestOperation class]]; 

      [self.objectManager putObject:invitation path:kMeetupKeyPath parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
      } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
       NSLog(@"Failure in PUT"); 
      }]; 
     } 
      break; 
    } 
} 

我做模板類似的東西端點

- (void)saveAsTemplate 
{ 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    self.objectManager = [self getObjectManager]; 
    self.objectManager.managedObjectStore = appDelegate.managedObjectStore; 

    RKEntityMapping *invitationMapping = [RKEntityMapping mappingForEntityForName:kInviteTemplates 
                  inManagedObjectStore:self.objectManager.managedObjectStore]; 
    invitationMapping = [RESTMappingProvider invitionTemplateMapping:invitationMapping]; 


    RKEntityMapping *activityMapping = [RKEntityMapping mappingForEntityForName:kActivityTemplates 
                  inManagedObjectStore:self.objectManager.managedObjectStore]; 
    activityMapping = [RESTMappingProvider activityTemplateMapping:activityMapping]; 

    [invitationMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:kTemplateActivitiesRelationship 
                         toKeyPath:kTemplateActivitiesRelationship 
                        withMapping:activityMapping]]; 

    STInvitesTemplate *invitation = [self templateForInvite];//this method assigns values to the attributes 

    [self setupDescriptors:invitationMapping forKeyPath:kTemplatesKeyPath descriptorClassIsTemplate:YES]; 
    [self.objectManager.HTTPClient registerHTTPOperationClass:[AFHTTPRequestOperation class]]; 

    [self.objectManager postObject:invitation path:kTemplatesKeyPath parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 

    } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
    }]; 
} 

請求&響應描述:

- (void)setupDescriptors:(RKEntityMapping *)invitationMapping forKeyPath:(NSString *)keyPath descriptorClassIsTemplate:(BOOL)isTemplate 
{ 

    RKRequestDescriptor *requestDescriptor; 
    if (isTemplate) 
    { 
     requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[invitationMapping inverseMapping] objectClass:[Template class] rootKeyPath:nil method:RKRequestMethodAny]; 
    } 
    else 
    { 
     requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[invitationMapping inverseMapping] objectClass:[Invite class] rootKeyPath:nil method:RKRequestMethodAny]; 
    } 
    NSIndexSet *statusCodeSet = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); 

    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:invitationMapping 
                          method:RKRequestMethodGET 
                         pathPattern:keyPath 
                          keyPath:nil 
                         statusCodes:statusCodeSet]; 

    self.objectManager.requestSerializationMIMEType = RKMIMETypeJSON; 
    [self.objectManager addRequestDescriptor:requestDescriptor]; 
    [self.objectManager addResponseDescriptor:responseDescriptor]; 

} 

我知道上面的方法不正確,因爲Xcode在POST或PUT後崩潰。我還沒有實現刪除但B/C我不知道如何正確設置它。

我是否在viewDidLoad中加載映射ONCE?我是否創建了PUT, POST, DELETE x 2 EndPoints = 6 RKEntityMappings

需要關於最佳實踐的一些指導。代碼示例或一些分步說明會很棒!

回答

1

您需要創建許多不同的映射,因爲您有不同的結構響應過程。如果一個實體類型的響應是一些公共超集的所有子集,那麼您只能使用一個(用於映射響應,另一個用於請求)。你不會說預期的JSON,所以我不能說。

在你的代碼中,我看到了2個請求描述符和1個響應描述符。這些請求與任何方法匹配,因此將始終使用。響應描述符僅匹配GET響應,因此不適用於任何事情。您應該每個方法的每個端點可能有一個響應描述符(因爲您說他們需要應用不同的映射)。

viewDidLoad不一定是配置此的正確位置。它看起來像你有一個單一的對象管理器,並且這個配置代碼應該在創建時運行(不是在它被使用時,因爲視圖可以被加載多次並且配置將被複制)。

+0

謝謝。 Reponse JSON與發送的內容相同。所以無論發送什麼也會返回。刪除映射會更容易嗎?或者創建多個objectManager實例? – user1107173

+1

都沒有。1管理器,可能有6個請求和響應描述符以及3個映射(如果請求與響應JSON相反,則爲反向)。 – Wain

+0

很酷。在AppDelegate中設置它很好嗎? – user1107173

相關問題