删除保存在设备上的 plist 中的第一项
Posted
技术标签:
【中文标题】删除保存在设备上的 plist 中的第一项【英文标题】:Deleting the first item in plist saved on device 【发布时间】:2018-11-05 16:02:58 【问题描述】:对不起,这有点长,但我已经为此苦苦挣扎了一周...我通过修改此 code 创建了一个位置跟踪 ios 应用程序。 LocationManager 文件将一个新位置添加到我的“LocationArray.plist”中,该位置保存在可以通过文件共享访问的设备上。
plist 如下所示:LocationArray.plist
我创建了一个使用 Web 请求的方法,如果 requestReply
返回“OK”,我想删除 LocationArray 中 plist 上的第一项(项 0)。因为它是一个保存的配置文件,如果我调用[self.myLocationArrayInPList removeObjectAtIndex:0]
,它会注册它已被删除,但它实际上并没有从 LocationArray.plist 中的savedProfile
中删除。
- (void)removeLocationFromPList
NSString *plistName = [NSString stringWithFormat:@"LocationArray.plist"];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
NSString *fullPath = [NSString stringWithFormat:@"%@/%@", docDir, plistName];
NSMutableDictionary *savedProfile = [[NSMutableDictionary alloc] initWithContentsOfFile:fullPath];
for (NSDictionary *frame in _myLocationArrayInPlist)
NSString *uniqueIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
NSNumber *two = [frame objectForKey:@"Latitude"];
NSNumber *three = [frame objectForKey:@"Longitude"];
NSDate *four = [frame objectForKey:@"Time"];
NSArray *keys = [_myLocationDictInPlist allKeys];
NSString *latitude = [two stringValue];
NSString *longitude = [three stringValue];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
NSString *time = [dateFormatter stringFromDate:four];
NSURLComponents *components = [NSURLComponents componentsWithString:@"http://api.earlyconnect.com/Product/GPSLog.ashx"];
NSURLQueryItem *identifier = [NSURLQueryItem queryItemWithName:@"id" value:uniqueIdentifier];
NSURLQueryItem *lat = [NSURLQueryItem queryItemWithName:@"lat" value:latitude];
NSURLQueryItem *lng = [NSURLQueryItem queryItemWithName:@"lng" value:longitude];
NSURLQueryItem *tim = [NSURLQueryItem queryItemWithName:@"t" value:time];
components.queryItems = @[ identifier, lat, lng, tim ];
NSURL *url = components.URL; // URL with parameters filled in
NSString *urlString = [url absoluteString];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSData * responseData = [requestReply dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
if([requestReply isEqual:@"OK"])
// ERASE FIRST ITEM IN PLIST HERE
] resume];
据我了解,我必须删除 savedProfile 中的 myLocationArrayInPlist 和 myLocatiionDictInPlist ......但我不确定。请帮忙!
【问题讨论】:
【参考方案1】:当您从字典中删除第一项时,您只是从文件的内存副本中删除,实际上并没有更改文件本身。
删除所有要删除的内容后,您需要将字典保存回磁盘。
你可以使用:
[self.myLocationArrayInPList removeObjectAtIndex:0]
[self.myLocationArrayInPList writeToURL:URLtoFile error:&error]
在此处查看文档:https://developer.apple.com/documentation/foundation/nsdictionary/2879139-writetourl?language=objc
【讨论】:
【参考方案2】:我加了
self.myLocationArrayInPlist = [savedProfile objectForKey:@"LocationArray"];
[self->_myLocationArrayInPlist removeObject:frame];
[savedProfile writeToFile:fullPath atomically:YES];
这也很有效!
【讨论】:
以上是关于删除保存在设备上的 plist 中的第一项的主要内容,如果未能解决你的问题,请参考以下文章
使用Apache-beam在Python中删除字典中的第一项[重复]