2011-06-29 11 views
1

私はJSONKitを使用してデシリアライゼーションを少し行いました。それは働いていますが、私が書いたことはかなりかすかな感じです。誰もが改善をお願いします。iPhone - JSONKit - 働いていますが、私はそれを正しく使用していますか?

//call web service with url and staff id 
    NSString *result = [MobileAppDelegate webServiceExecuteGetSingleWithId:StaffId 
    atUrl:@"XXXXXXXX"]; 

    //create NSDictionary from JSON return type 
    NSDictionary *items = [result objectFromJSONString]; 

    NSArray *ar = (NSArray*)[items objectForKey:@"SummaryJsonResult"]; 

    for(int i = 0; i < [ar count]; i++){ 
     NSDictionary *tmpDict = (NSDictionary*)[ar objectAtIndex:i]; 
     AlertItem *tmpItem = [[AlertItem alloc] init]; 
     tmpItem.Description = [tmpDict objectForKey:@"Description"]; 
     tmpItem.NumItems = [tmpDict objectForKey:@"ItemCount"]; 
     tmpItem.ModuleGroup = [tmpDict objectForKey:@"ModuleGroup"]; 
     tmpItem.StaffID = [tmpDict objectForKey:@"StaffID"]; 
     tmpItem.status - [tmpDict objectForKey:@"Status"]; 
     [array addObject: tmpItem]; 
     [tmpItem release]; 
    } 

答えて

2

これは基本的にどのように行う必要がありますか。あなたは少し物事をクリーンアップすることができます。ファクトリメソッドに辞書からAlertItemを作成

for (NSDictionary *tmpDict in [items objectForKey:@"SummaryJsonResult"]) { 
    ... 

リファクタリング:全ての

+ (AlertItem *)alertItemWithDictionary:(NSDictionary *)dict { 
    AlertItem *item = [[self alloc] init]; 
    ...do the same stuff you do in the loop 
    return [item autorelease]; 
} 

... then in the loop you just do: 
[array addObject:[AlertItem alertItemWithDictionary:tempDict]]; 
+0

よろしくお願いします。 NSDictionaryからNSArray、NSDictionaryに戻る方法があるかどうか疑問に思っていました。その3つのすべてのために行うオブジェクトのいくつかの並べ替えがある必要がありますように思われる? – shaw2thefloor

1

まず、それはそう

for-inループを使用します同期リクエストを実行しているかのように、通常は悪い考えです。メインスレッドでこれを実行している場合は、リクエストが完了するまですべてのユーザーのやりとりをブロックしています。

あなたのコードでは、不正なデータも処理されません。あなたのアプリケーションは、あなたのJSON内のオブジェクトのいずれかがあなたが期待するものと異なるタイプであればクラッシュします。 "SummaryJsonResult"が配列の代わりに辞書を指している場合は、objectForKey:というメッセージを送信しようとすると「認識できないセレクタ」例外が発生します。 isKindOfClass:またはrespondsToSelector:を使用してこれを防ぐことができます。

+0

これはありがとうございます。私はそれを非同期要求に変更します。正確なフォーマットがわからない場合は、jsonからデータを取得する特に良い方法はありますか?私は自分のWebサービスを呼び出すので、返されるものを制御できますが、別の方法があればいいと思います。 – shaw2thefloor

+0

事は非同期要求で、私はUITableViewを実装するために配列を使用しているので、データ配列が作成される前にテーブルビューにデータを挿入しようとしていません。私はこれがヌルポインタを引き起こすと思いますか? – shaw2thefloor

+0

空の配列として初期化できます。インスタンス変数は自動的にnilに初期化され、コンテキストに応じてnil(この場合は 'count')にメッセージを送信すると0またはnilが返されるため、これを行う必要はありません。 – omz

関連する問題