-1

在 Objective-C 中,我想将 plist 与我正在使用的 API 的结果进行比较。我正在使用一个返回食谱成分的 API。我将这些结果放入一个表格视图中,向用户显示配方名称和配方成分。当用户选择他们选择的任何食谱时,我希望出现一个 UIAlert 来告诉用户天气是否他们拥有该特定食谱的所有成分。API 中的成分将与 Plist 进行比较。希望这足够清楚,如果不只是问,我会尝试更清楚地解释它。

4

2 回答 2

1

如果我理解得很好,用户冰箱里的成分是从 plist 文件中提取的。

阅读 plist 并将其存储在 NSDictionary 中真的很容易。然后您可以与程序返回的成分进行比较。

如果 plist 是由您的程序生成的,那么您可以比较程序中对您有意义的任何内容:例如对象“Ingredient”的索引。如果不是,那么您的比较可能很弱,具体取决于您选择比较的内容。

对于配方中的每种成分,您可以检查属于该用户的相同成分的数量。

于 2013-03-19T01:36:17.273 回答
1

您想知道是否所有必需的成分都在橱柜中。您只需要一个是或否的结果。所以你从你的数据中制作了两个 NSArrays - requiredIngredients 和 foodCupboard。

- (BOOL) weHaveIngredients:(NSArray*)requiredIngredients inCupboard:(NSArray*)foodCupboard
{
 BOOL result = YES;
  For (id ingredient in requiredIngredients) {
      if !(foodCupboard containsObject:ingredient) {
         result = NO;
         break;
       }
  }
  return result;
}

使用 NSSet(唯一对象的集合)可以更好地完成此操作。您可以轻松地从 NSArray 创建 NSSet:

NSSet* set = [NSSet setWithArray:(NSArray*)array];

然后你可以这样做:

- (BOOL) weHaveIngredients:(NSSet*)requiredIngredients inCupboard:(NSSet*)foodCupboard
{
  BOOL result = YES;
  if (!requiredIngredients isSubsetOfSet:foodCupboard)
       result = NO;
  return result;
}

你可以使用它像

NSString* alertmessage = "Sorry we can't make a cake, not enough ingredients"
if ([self weHaveIngredients:recipeIngredients inCupboard:foodCupboard])
    alertmessage = "Start baking"

UIAlertView *alert =
    [[UIAlertView alloc] initWithTitle: @"Ingredients checked"
                         message: alertMessage
                         delegate: self
                         cancelButtonTitle: @"OK"
                         otherButtonTitles: nil];
[alert show];

您的另一个问题是将数据转换为两个数组的形式。当您将其放入 tableView 时,您必须已经从 API 中获取了一个数组。我同样假设您知道如何从(存储的?)plist 中获取数组,因为您必须以某种方式制作了 plist。如果您有特定的数据转换问题,我建议您提出一个更具体的问题。

这些都没有解决您是否有足够的每种成分的问题——要正确地做到这一点,您将需要某种数据库。

于 2013-03-19T01:36:18.817 回答