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