iOS 模拟解决多个客户端对同一Item进行编辑

来源:互联网 发布:淘宝客设置技巧 编辑:程序博客网 时间:2024/06/06 16:36

需求是这样的:当我们的产品处于Offline 的状态时我们是可以对产品内部进行增删改的,只不过我们点击Save 之后会把我们的操作结果储存在本地缓存中,等到我们处于Online的状态的时候在向服务端进行发送,这就有可能出现一个Conflict,就是在我们Offline这段时间有其他的客户端对该产品进行了更改或者删除,这时候我们就需要通过对比ModifyTime 来进行取舍,最终保留ModifyTime 较晚的那个Edit 或者Delete,下面是我模拟解决该问题的部分代码:

#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];        [self setData];//    [self.arrayData replaceObjectAtIndex:1 withObject:@"F"];               double delayzhangsanInSeconds = 3.0;    dispatch_time_t zahngsanpopTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayzhangsanInSeconds * NSEC_PER_SEC));    dispatch_after(zahngsanpopTime, dispatch_get_main_queue(), ^(void){        [self assignment:self.lastOptionDate changeData:@"zhangsan" myOptionDate:self.zhangsan.OptionDate array:self.arrayData];          });            const char *queueName = [@"hwj" UTF8String];    dispatch_queue_attr_t myQueue = dispatch_queue_create(queueName, NULL);        double delaylisiInSeconds = 6.0;    dispatch_time_t lisipopTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delaylisiInSeconds * NSEC_PER_SEC));    dispatch_after(lisipopTime, myQueue, ^(void){              [self assignment:self.lastOptionDate changeData:@"lisi" myOptionDate:self.lisi.OptionDate array:self.arrayData];            });    }- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}/** *  设置初始化数据 */- (void)setData{     NSDate *data = [NSDate date];    self.lastOptionDate = [data dateByAddingTimeInterval:-3600];    NSMutableArray *array= [[NSMutableArray alloc]initWithObjects:@"a",@"b",@"c",nil];    self.arrayData = array;    self.zhangsan = [[Person alloc]init];    self.lisi =[[Person alloc]init];    self.zhangsan.OptionDate = data;    self.lisi.OptionDate = [data dateByAddingTimeInterval:2];}/** *  对该数组中元素进行更改 * *  @param lastOptionDate 最近一次更改的时间 *  @param data           把数组中对应索引位置的元素替换成该值 *  @param myDate         本次进行Option 的时间 *  @param array          要操作的数组 */- (void)assignment:(NSDate * )lastOptionDate changeData:(NSString * )data myOptionDate:(NSDate *)myDate array:(NSMutableArray*)array{    if([lastOptionDate isEqualToDate:[lastOptionDate earlierDate:myDate]]){        //进行操作        [array replaceObjectAtIndex:1 withObject:data];        self.lastOptionDate = myDate;         NSLog(@"++++++%@",self.arrayData[1]);    }else{                return;    }}@end

还有一个Person的类,其中只有 name和Optiondate 在这里就不赘述了。。

由于李四的修改时间晚于张三的修改时间,由程序协定的时张三延迟三秒执行,李四延迟六秒执行,所以运行图如下:


由于李四的修改时间晚于张三的修改时间,如果张三延迟六秒执行,李四延迟三秒执行,所得运行图如下:


这里由于李四先执行的,而张三的Modify 时间又早于李四,所以张三的Modify 不生效

1 0