2014-02-09 36 views
1
NSDictionary *partyOne = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithInt:2], @"type", 
           [NSNumber numberWithInt:1], @"status", 
           @"name", @"name", 
           @"name", @"nid", 
           @"name", @"nationality", 
           @"", @"address", 
           @"name", @"mobile", 
           nil]; 

    NSDictionary *partyTwo = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithInt:2], @"type", 
           [NSNumber numberWithInt:1], @"status", 
           @"name", @"name", 
           @"name", @"nid", 
           @"name", @"nationality", 
           @"", @"address", 
           @"name", @"mobile", 
           nil]; 


    NSArray *partyArray = [NSArray arrayWithObjects: partyOne, partyTwo, nil]; 

    NSDictionary *finalData =[NSDictionary dictionaryWithObject: partyArray forKey:@"details"]; 

轉換元件的陣列,同時發佈的數據PHP當我發送上面的NSDictionary以如下PHP AFNetworking 2,的NSDictionary與NSArray的使用AfNetworking 2

// Send the data to server 
    NSDictionary *regDic = [self generteJasonData]; 

    // Send the registered data to server 
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    [manager.requestSerializer setAuthorizationHeaderFieldWithUsername:userName password:userpassWd]; 
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
    [manager setShouldUseCredentialStorage:NO]; 

    NSMutableURLRequest *request = [manager.requestSerializer requestWithMethod:@"POST" URLString:@"http://testlink/submit"parameters:regDic]; 
    [request setHTTPShouldHandleCookies:NO]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
    AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer]; 
    [operation setResponseSerializer:serializer ]; 
    [operation setShouldUseCredentialStorage:NO]; 
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"Success: %@", responseObject); 
     [manager.requestSerializer clearAuthorizationHeader]; 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Failure: %@ responce :%@", error,operation.responseString); 
     [manager.requestSerializer clearAuthorizationHeader]; 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"upload", @"")                       message:NSLocalizedString(@"Some error occureed while uploading data, please tryagain later", @"") 
                 delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
     [alert show]; 


    }]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
    [operation start]; 

我收到它在我的php服務器爲,

details =    (
           { 
        address = ""; 
       }, 
           { 
        mobile = name; 
       }, 
           { 
        name = name; 
       }, 
           { 
        nationality = name; 
       }, 
           { 
        nid = name; 
       }, 
           { 
        status = 1; 
       }, 
           { 
        type = 2; 
       }, 
           { 
        address = ""; 
       },   { 
        mobile = name; 
       },   { 
        name = name; 
       }, 
           { 
        nationality = name; 
       }, 
           { 
        nid = name; 
       }, 
         { 
        status = 1; 
       }, 
           { 
        type = 2; 
       }, 
      ); 

即我有發送2個數組元素,但我收到它的許多數組元素。 任何人都可以讓我知道這裏有什麼問題。是他們AFNetworking 2.0 API的任何問題或者我的代碼的問題。

+1

這裏'的NSDictionary * FinalData的= [NSDictionary的dictionaryWithObject:arrayDictionary forKey:@ 「細節」];'什麼'arrayDictionary'? –

+0

@katre,我編輯了我的查詢。這是「partyArray」 – Vaz

+0

我遇到了同樣的問題,瓦茲,你找到了解決辦法? –

回答

2

好了,你需要做的,是固定在文件AFURLRequestSerialization.m方法

NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) 

:中 代替

for (id nestedValue in array) 

使其

for (int i = 0;i < [array count];++i) 

,然後代替

[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)]; 

使其

[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[%d]", key,i], nestedValue)]; 
+0

精湛的答案兄弟。我很驚訝,爲什麼這個答案是不能接受的,但你應該解釋更 – pankaj

+0

老兄,你剛纔救了我:)一天,我只花了我半天了這個問題。謝謝一噸 –

0

AFNetworking 2.0:我用@gilad答案,修改它一下,使其正常工作。所以我所做的是寫在下面:

NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) { 
    NSMutableArray *mutableQueryStringComponents = [NSMutableArray array]; 

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(compare:)]; 

    if ([value isKindOfClass:[NSDictionary class]]) { 
    NSDictionary *dictionary = value; 
    // Sort dictionary keys to ensure consistent ordering in query string, which is important when deserializing potentially ambiguous sequences, such as an array of dictionaries 
    for (id nestedKey in [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { 
     id nestedValue = [dictionary objectForKey:nestedKey]; 
     if (nestedValue) { 
      [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)]; 
     } 
    } 
    } else if ([value isKindOfClass:[NSArray class]]) { 

    // This is modified by me 
    NSArray *array = value; 
    int i = 0; 
    for (id nestedValue in array) { 
    // A check has been added for NSDictionary 
     if ([nestedValue isKindOfClass:[NSDictionary class]]) { 
      //Here i used @gilad's answer 
      [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[%d]", key,i], nestedValue)]; 

     }else{ 

     [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)]; 
     } 
     i++; 
    } 
    } else if ([value isKindOfClass:[NSSet class]]) { 
     NSSet *set = value; 
     for (id obj in [set sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { 
      [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue(key, obj)]; 
     } 
    } else { 
     [mutableQueryStringComponents addObject:[[AFQueryStringPair alloc] initWithField:key value:value]]; 
    } 

    return mutableQueryStringComponents; 
} 

我剛纔編輯的AFQueryStringPairsFromKeyAndValue在AFURLRequestSerialization.m類如上所述,然後開始工作,我們想要的方式。

+0

如何使用這個?我需要做的請求與以下格式, [ { 「路徑」: 「/」, 「值」:{ 「狀態」: 「ACTIVE」 }, 「OP」: 「替換」 } ] 你能解釋更多嗎?向我顯示您的使用代碼.. – karthikeyan

+0

@karthikeyan我的請求類似於[{},{},{}]格式。正如我在答覆中提到我已經更換的NSArray * AFQueryStringPairsFromKeyAndValue(的NSString *鍵,值id)這個方法地雷 – pankaj

+0

@karthikeyan如果你還在尋找解決方案,那麼你可以告訴我。我可以嘗試給你編輯AFNetworking框架 – pankaj