2013-03-19 47 views
-1

在Objective-C中,我想將plist與我正在使用的API的結果進行比較。我正在使用返回食譜配料的API。我將這些結果放入表格視圖中,向用戶顯示配方名稱和配方成分。當用戶選擇他們選擇的任何配方時,我想要顯示一個UIAlert,告訴用戶天氣,他們擁有該特定配方的所有成分。來自API的成分將與Plist進行比較。希望這很清楚,如果不是隻是問,我會試着更清楚地解釋它。比較目標-C中的兩個參數

+2

在Xcode中會遇到麻煩。雖然可能在Objective-C中。 – 2013-03-19 00:49:05

+4

順便說一句,你有問題嗎? – 2013-03-19 00:49:27

回答

1

如果我理解的很好,用戶在冰箱裏的配料是從plist文件中提取的。

閱讀plist並將其存儲在NSDictionary中非常簡單。然後你可以比較你的程序返回的成分。

如果plist是由程序生成的,那麼您可以比較程序中對您有意義的任何內容:例如,對象「成分」的索引。 如果不是,那麼您的比較可能會比較弱,這取決於您選擇比較的內容。

對於您食譜中的每種配料,您可以檢查屬於該用戶的同一配料的編號。

1

您想知道是否所有必需的成分都在櫥櫃中。你只需要一個YES或NO的結果。因此,您需要從數據中提取兩個NSArrays - 必需的成分和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; 
} 

用NSSets(唯一對象的集合)更好地完成此操作。您可以從一個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。如果你有特定的數據轉換問題,我建議你問一個更具體的問題。

這都沒有解決你是否有足夠的每個成分 - 正確地做到這一點,你會想要某種數據庫。