我有一个多线程应用程序,我有一个问题,我可以在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];
});
}
因此可以从不同的线程或其他方法编辑项目,我不知道如何使这项工作很好。我相信代表团对此非常好,但我不能在这里实现,任何想法?
答案 0 :(得分:0)
同步您的模型操作。这样你就可以避免出乎意料的结果。您可以阅读(Apple文档):https://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html。
关于您不知道的数据更改...只需创建一个observable和一个观察者(http://en.wikipedia.org/wiki/Observer_pattern),并通知每个人数据已更改。这样,当后台线程更改您的数据时,您的视图控制器将收到通知,您可以采取相应的行动。