Удаление первого элемента из списка сохраненных на устройстве - PullRequest
0 голосов
/ 05 ноября 2018

Извините, это немного долго, но я борюсь с этим уже неделю ... Я создал приложение iOS для отслеживания местоположения, изменив этот код . Файлы LocationManager добавляет новое местоположение в мой «LocationArray.plist», который сохраняется на устройстве, к которому можно получить доступ с помощью общего доступа к файлам.

Список выглядит следующим образом: LocationArray.plist

Я создал метод, который использует веб-запрос, и если requestReply возвращает «OK», я хочу стереть первый элемент в списке (Item 0) в LocationArray. Поскольку это сохраненный профиль, если я вызываю [self.myLocationArrayInPList removeObjectAtIndex:0], он регистрирует, что он был удален, но фактически не удаляется из savedProfile в LocationArray.plist.

- (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];
     }
 }

Насколько я понимаю, мне нужно стереть myLocationArrayInPlist и myLocatiionDictInPlist внутри сохраненного профиля ... но я не уверен. Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Я добавил

            self.myLocationArrayInPlist = [savedProfile objectForKey:@"LocationArray"];
            [self->_myLocationArrayInPlist removeObject:frame];
            [savedProfile writeToFile:fullPath atomically:YES];

и это тоже сработало!

0 голосов
/ 05 ноября 2018

Когда вы удаляете первый элемент из словаря, который вы удаляете только из копии файла в памяти, вы фактически не изменяете сам файл.

Как только вы закончите удаление всего, что хотите удалить, вам нужно сохранить словарь обратно на диск.

Вы можете использовать:

[self.myLocationArrayInPList removeObjectAtIndex:0]
[self.myLocationArrayInPList writeToURL:URLtoFile error:&error]

См. Документ здесь: https://developer.apple.com/documentation/foundation/nsdictionary/2879139-writetourl?language=objc

...