2012-10-11 2 views
0

pickerview에서 사용할 배열을 채우려합니다. 배열의 데이터는 데이터베이스 테이블에서 생성됩니다.json_encoded 데이터를 UIPickerView - Xcode에 사용할 배열로 구문 분석합니다.

I는 (PHP에서 생성) 다음 JSON_ENCODED 어레이 가지고 WEBSERVICE의 PHP 코드

{"result": 
[ 
    {"id":"3","quivername":"Kite Boarding"}, 
    {"id":"4","quivername":"Live and Die in LA"}, 
    {"id":"14","quivername":"Bahamas Planning"}, 
    {"id":"15","quivername":"My Trip to India"}, 
    {"id":"16","quivername":"Snowboarding"} 
] 
} 

UPDATE를

I는 웹 서비스로서 이러한 기능 실행 I는 이것을 사용

passport($_SESSION['IdUser']) 

function passport($userid) { 

$result = query("SELECT id, quivername FROM quivers WHERE userid = $userid"); 

if (!$result['error']) { 
    print json_encode($result); 
} else { 
     errorJson('Can not get passports'); 
    } 
} 

function query() { 
global $link; 
$debug = false; 

//get the sql query 
$args = func_get_args(); 
$sql = array_shift($args); 

//secure the input 
for ($i=0;$i<count($args);$i++) { 
    $args[$i] = urldecode($args[$i]); 
    $args[$i] = mysqli_real_escape_string($link, $args[$i]); 
} 

//build the final query 
$sql = vsprintf($sql, $args); 

if ($debug) print $sql; 

//execute and fetch the results 
$result = mysqli_query($link, $sql); 
if (mysqli_errno($link)==0 && $result) { 

    $rows = array(); 

    if ($result!==true) 
    while ($d = mysqli_fetch_assoc($result)) { 
     array_push($rows,$d); 
    } 

    //return json 
    return array('result'=>$rows); 

} else { 

    //error 
    return array('error'=>'Database error'); 
} 
} 

을 NSNetworking을 사용하여 웹 사이트/웹 사이트에 연결하는 Xcode의 코드 ...

-(void)getPassports { 
    //just call the "passport" command from the web API 
    [[API sharedInstance] commandWithParams:[NSMutableDictionary dictionaryWithObjectsAndKeys: 
     @"passport",@"command", 
     nil] 
     onCompletion:^(NSDictionary *json) 
     { 
     //got passports, now need to populate pickerArray1 
     if (![json objectForKey:@"error"]) 
     { 
        //success, parse json data into array for UIPickerview 
     } 
     else 
     //error, no passports 
     { 
        // error alert 
     } 

     }]; 
} 

다음이 필요합니다.

1) NSMutable 배열에 quivername 값을 어떻게 채울 수 있습니까? 내가 먼저 배열의 행 수를 "계산"나를 필요로하는 for 루프를 실행할 필요가 있으리라 믿고있어

pickerArray1 = [[NSMutableArray alloc] initWithObjects:@"Kite Boarding", 
@"Live and Die in LA", @"Bahamas Planning", @"My Trip to India", @"Snowboarding", 
nil]; 

,하지만 난 :이처럼 보이는 결과를 얻으려고 확실하지 않아. json_array의 행 수를 계산하거나 NSMutable 배열을 만드는 방법을 모르겠습니다. 사전에

감사합니다 ...

+0

어떻게 iOS 앱에 JSON을 PHP를 생성지고있다? 더 많은 코드를 제공 할 수 있습니까? – propstm

답변

1

아래에 JSON을 기반으로 어떤 그런 다음, [NSData dataWithContentsOfURL:yourURLValue]를 사용하여 JSON을 반환하는 URL에서있는 NSData를 얻을 데이터를 전달과 비슷한을 사용하여 분석 할 수 있어야한다 :

//INVOKE WEB SERVICE QUERY IN VIEW DID LOAD -- RUNS ASYNC SO WONT BLOCK UI 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     NSData* data = [NSData dataWithContentsOfURL: 
      @"URLOFYOURWEBSERVICE"]; // <-- may need to cast string to NSURL.... 
     NSMutableArray *quivernames = [self performSelectorOnMainThread:@selector(fetchedData:) 
      withObject:data waitUntilDone:YES]; 
    }); 
} 

- (NSMutableArray *)fetchedData:(NSData *)responseData { 
    //parse out the json data 
    NSError* error; 
    //ARRAY OR DICT DEPENDING ON YOUR DATA STRUCTURE 
    NSDictionary* json = [NSJSONSerialization 
     JSONObjectWithData:responseData 

     options:kNilOptions 
     error:&error]; 
    //ITERATE AND/OR ADD OBJECTS TO YOUR NEW ARRAY 
    NSMutableArray* JSONResultValues = [json objectForKey:@"yourKey"]; 
    NSMutableArray* resultValues = [[NSMutableArray alloc] init]; 
    for(int x = 0; x< [JSONResultValues count]; x++){ 
     NSDictionary *tempDictionary = [JSONResultValues objectAtIndex:x]; 
     [resultValues addObject:[tempDictionary objectForKey:@"quivername"]]; 
    } 

    NSLog(@"Results Count: %@", [JSONResultValues count]); 
    NSLog(@"Results Count: %@", [resultValues count]); 
    return resultValues; 
} 

편집 : 추가 정보를 위해 JSON 구문 분석이 설명을 확인 http://www.raywenderlich.com/5492/working-with-json-in-ios-5

+0

하, 우리는 거의 동일한 코드를 게시했습니다. : D – PruitIgoe

+0

배열을 반복하는 코드를 추가해야합니까? 내 코드를 업데이트했는데 이것이 접근 방식을 변경합니까? –

+0

나는 당신의 결과 키를 당신의 물건에 넣을 것입니다. serviceResults의 두 번째 배열을 만드는 것이 더 쉬울 수도 있습니다. 그것은 당신에게 일련의 데이터를 제공해야합니다. 해당 배열의 각 항목에 대해 사전을 만들고 quivername 키에 대한 객체 (NSString *)를 배열 serviceResults에 저장합니다.이 배열은 문자열 배열을 제공해야합니다. – propstm

0

이 (테스트되지 않은)을 시도 할 수 :

//convert this to NSData, not sure how it is getting into obj-c 
{"result":[ 
    {"id":"3","quivername":"Kite Boarding"}, 
    {"id":"4","quivername":"Live and Die in LA"}, 
    {"id":"14","quivername":"Bahamas Planning"}, 
    {"id":"15","quivername":"My Trip to India"}, 
    {"id":"16","quivername":"Snowboarding"} 
]}; 

NSMutableArray* myData = [self fetchedData:responseData]; 

- (NSMutableArray*)fetchedData:(NSData *)responseData { 

    //parse out the json data 
    NSError* error; 
    NSDictionary* json = [NSJSONSerialization 

     JSONObjectWithData:responseData 

     options:kNilOptions 
     error:&error 
    ]; 

    NSMutableArray* quivers = [json objectForKey:@"result"]; 

    return quivers; 
} 

Wenderlich explains it here...

+0

난 그게 아이폰에 들어가는 방법을 보여주기 위해 코드를 업데이 트, 당신이 설명한 접근 방식을 변경합니까? –

+0

Nah, 그냥 방법 json을 가져 와서 변환하면, json이 어떻게 들어오는 지 상관 없습니다. – PruitIgoe

+0

ViewDidLoad에서 가정 : NSMutableArray * myData = [self fetchedData : responseData]; 그러나이 작업을 수행 할 때 "선언되지 않은 식별자 'responseData'를 사용합니다 ... –

관련 문제