如何在几个线程中使用plist

时间:2013-08-19 16:16:49

标签: objective-c multithreading plist

我有一个带有2个标签的简单多线程应用程序。每个选项卡都是一个包含许多项目的表格视图,有关它们的信息保存在plist文件中,结构如下:

<key>Items</key>
<array>
    <dict>
        <key>Name</key>
        <string>Bosch KGN36X45</string>
        <key>Price</key>
        <string>18890</string>
        <key>Quantity</key>
        <real>33</real>
    </dict>

我需要在多个线程中使用此文件,例如在一个线程中我可以使用代码删除该项:

- (void)removeItemAtRow:(int)row
{
    [items removeObjectAtIndex:row];
    NSMutableDictionary *plistDict = [NSDictionary dictionaryWithObject:items forKey:@"Items"];
    [self saveAppFile:plistDict];
}

我可以在其他视图控制器中打开此项进行编辑:

- (void) updateViews
{
    NSDictionary *item = [[[DataController sharedInstance] getItems] objectAtIndex:itemRow];
    NSLog(@"%@", item);
    self.nameLabel.text = [item objectForKey:@"Name"];
    self.priceLabel.text = [NSString stringWithFormat:@"%@ руб.", [item objectForKey:@"Price"]];
    self.quantityLabel.text = [NSString stringWithFormat:@"%@ шт.", [item objectForKey:@"Quantity"]];
}

所以当在第一个线程中项目将被删除 - 当我在第二个线程中编辑它时 - 它将此项目保存在另一个项目上,现在在删除更改后的另一行上,所以我有几个使用plist进行多线程处理的问题。如何使用文件保存操作?

1 个答案:

答案 0 :(得分:1)

如果您不希望线程在彼此之上执行,那么您应该尝试使用它们可以访问的某个整数值,然后根据是否更改它可以编辑plist。这通常称为信号量。我同意Jeremy的观点,即在这种情况下多线程的好处很少:

General info on semaphores.

如果您同意并想要使用它们,请询问并提供更详细的解释/实施帮助。

或者,如果您因某种原因绝对必须多线程并且不想使用信号量,我会建议Jeremy说的话,找到一个算法来组成一个唯一的标识符并跟踪它而不仅仅是使用它行号决定哪个项目是哪个。