0

我有一个带有 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 一起工作。如何进行文件保存操作?

4

1 回答 1

1

如果您不希望线程在彼此之上执行,那么您应该尝试拥有一些它们都可以访问的整数值,然后根据是否可以编辑 plist 来更改它。这通常称为信号量。我部分同意 Jeremy 的观点,即在这种情况下,多线程几乎没有什么好处:

关于信号量的一般信息。

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

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

于 2013-08-19T18:06:42.603 回答