0

我在 UI 上有一个观察者模式,它检查处理试图更新数据库上某个字段的服务器连接的对象的状态。

UI 的更新方法接收一个对象,该对象包含数据对,其中包含连接发生情况的信息。问题是我纠结于很多 ifs 检查不同的可能性。

- (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
}
}

当服务器以字符串响应时,我发现很难避免这种意大利面条式的代码。

在更新方法上发送哪个更智能的对象?

4

1 回答 1

0

您可以保持数据的原样,并将您期望的所有值[arg getData:@"updatee"]作为键放入字典中。这些值将是方法选择器的字符串表示形式,其中每个方法都处理当前if语句中的一种情况。现在,您的update:方法只是从字典中获取选择器字符串,将其转换为真正的选择器 ( NSSelectorFromString) 并调用该方法(将arg作为参数传递,此处使用的所有方法都必须具有匹配的参数列表)。如果您收到意外的更新类型,则不会发生任何事情,因此您应该记录/断言。如果您在翻译选择器时遇到异常,您可能有错字(执行配置中所有方法的测试的良好候选者)。

当然,您基本上可以对所有方法和一个肮脏的大 if / else 语句做同样的事情。

于 2013-09-15T16:53:44.850 回答