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

需求是这样的:当我们的产品处于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 不生效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值