0

我有一个多线程应用程序并且我有一个问题,我可以打开一个项目以在 UIViewController 中进行更改,但另一个线程中的数据已经可以更改,并且当我单击提交按钮时 - 我重写了另一个线程所做的更改。(例如,物品的数量发生了变化——有人在管理员更改仓库中物品的数量时购买了它)。

所以现在我有一个 UIViewController 可以编辑项目并进行如下更改:

- (IBAction)submitButton:(id)sender
{
        NSDictionary *changedData = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:nameField.text, priceField.text, quantityField.text, _itemUUID, nil]
                                                                forKeys:[NSArray arrayWithObjects: @"Name", @"Price", @"Quantity", @"UUID", nil]];
        [[EADataManager sharedInstance] updateItemWithData:changedData atUUID:_itemUUID];
        [self.navigationController popViewControllerAnimated:YES];
}

以及我的 dataManager 类中的数据更新方法:

- (void) updateItemWithData:(NSDictionary *)data atUUID:(NSString*)UUID
{
    [self networkActivityIndicatorVisible:YES];
    dispatch_barrier_async(_dataManagerQueue, ^{
        [NSThread sleepForTimeInterval:5.0];
        NSInteger path = [self indexFromObjectUUID:UUID];
        if (path != NSNotFound)
        {
            [_items replaceObjectAtIndex:path withObject:data];
            [_dataStorageAdapter saveFileWithData:_items];
        } else {
            [_items addObject:data];
            [_dataStorageAdapter saveFileWithData:_items];
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            [[NSNotificationCenter defaultCenter] postNotificationName:EADataManagerUpdateViews
                                                                object:nil];
        });
        [self networkActivityIndicatorVisible:NO];
    });
}

所以可以从不同的线程或其他方法编辑该项目,我不知道如何使其正常工作。我相信代表团对此很好,但我不能在这里实施,有什么想法吗?

4

1 回答 1

0

同步您的模型操作。这样您就可以免受意外结果的影响。您可以在(Apple 文档)阅读更多内容:https ://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html 。

关于您不知道的数据更改...只需创建一个 observable 和一个观察者 ( http://en.wikipedia.org/wiki/Observer_pattern ),并通知每个人数据已更改。这样,当后台线程更改您的数据时,您的视图控制器将收到通知,您可以采取相应的行动。

于 2013-09-29T07:34:35.697 回答