0

データベースの特定のフィールドを更新しようとしているサーバー接続を処理するオブジェクトのステータスをチェックする UI のオブザーバー パターンがあります。

UI の update メソッドは、接続で何が起こっているかの情報を含むデータ ペアを含むオブジェクトを受け取ります。問題は、さまざまな可能性をチェックするための多くの if に巻き込まれていることです。

- (void) update:(Bundle *)arg
{
    if ([[arg getData:@"updatee"] isEqualToString:@"email"]){
        UITableViewCell *emailCell = [[self tableView] cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
        if ([[arg getData:@"connecting"] isEqualToString:@"true"]) {
            //Email is being posted
            [_emailLabel_email setText:@"Connecting..."];
            [_emailLabel_set setHidden:YES];
            emailCell.accessoryType = UITableViewCellAccessoryNone;
            [_emailActivityIndicator startAnimating];
        }else{
            if ([[arg getData:@"succesfull"] isEqualToString: @"false"])
                //Email was posted unsuccesfully
                [[[UIAlertView alloc] initWithTitle:@"Taken Email Address"
                                    message:@"The email address that you entered is already in use, please double check it"
                                   delegate:nil
                          cancelButtonTitle:@"OK"
                          otherButtonTitles:nil] show];
            else{
                //Email was posted succesfully.
                [_emailLabel_set setText:@"Change"];

            }
            [_emailActivityIndicator stopAnimating];
            [_emailLabel_email setText:[mng getEmail]];
            [_emailLabel_set setHidden:NO];
            emailCell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        }
    }

 //Password cases
}
}

サーバーが文字列で応答するため、このコードのスパゲッティを避けるのは難しいと感じています。

update メソッドで送信するよりスマートなオブジェクトはどれですか?

4

1 に答える 1

0

[arg getData:@"updatee"]データをそのままにして、期待するすべての値をキーとしてディクショナリに入れることができます。値はメソッド セレクターの文字列表現であり、各メソッドは現在のifステートメントのケースの 1 つを処理します。これで、update:メソッドはセレクター文字列を辞書から取得し、それを実際のセレクター ( NSSelectorFromString) に変換して、メソッドを呼び出します ( をパラメーターとして渡しargます。ここで使用されるすべてのメソッドには、一致するパラメーター リストが必要です)。予期しない更新タイプを受け取った場合、何も起こらないため、ログに記録/アサートする必要があります。セレクターの変換中に例外が発生した場合は、おそらくタイプミスがあります (構成内のすべてのメソッドを実行するテストの良い候補です)。

もちろん、基本的にはすべてのメソッドとダーティーな大きな if / else ステートメントで同じことを行うことができます。

于 2013-09-15T16:53:44.850 に答える