在UIViewController中编辑期间更改了数据

时间:2013-09-29 07:04:51

标签: ios objective-c multithreading

我有一个多线程应用程序,我有一个问题,我可以在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];
    });
}

因此可以从不同的线程或其他方法编辑项目,我不知道如何使这项工作很好。我相信代表团对此非常好,但我不能在这里实现,任何想法?

1 个答案:

答案 0 :(得分:0)

同步您的模型操作。这样你就可以避免出乎意料的结果。您可以阅读(Apple文档):https://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html

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