2016-04-08 5 views
0

Я создаю Firebase словарь обновление как такобновления GeoFire в одном вызове

NSDictionary *update = @{ 
         key1 : value1, 
         key2 : value 2, 
         key3 : value 3 
         }; 

[baseRef updateChildValues:update withCompletionBlock:^(NSError *error, Firebase *ref) { 
      // complete 
     }]; 

Но я бы также хотел бы сохранить координаты местоположения в пределах того же обновления, иначе не приходится делать 2 отдельных звонки. Я взял посмотреть на this Github странице, но я не могу понять, как сделать что-то вроде этого

[geoFire setLocation:[[CLLocation alloc] initWithLatitude:37.7853889 longitude:-122.4056973] 
      forKey:@"firebase-hq"]; 

в том же обновления, как мой первый пример?

Есть ли предпочтительный способ сделать это, или мне нужно что-то сделать самому? Например, измените библиотеку или установите CLLocation на обновление как любую другую переменную? Что-то вроде этого:

-(void)setLocation:(CLLocation *)location forRef:(Firebase *)ref 
{ 
    NSNumber *lat = [NSNumber numberWithDouble:location.coordinate.latitude]; 
    NSNumber *lng = [NSNumber numberWithDouble:location.coordinate.longitude]; 
    NSDictionary *update = @{ @"location" : @[ lat, lng ] }; 

    [ref setValue:update withCompletionBlock:^(NSError *error, Firebase *ref) { 
     // complete 
    }]; 
} 

Редактировать

вот кусок кода, который очень похож на том, что в моем проекте:

-(void)uploadUserId:(NSString *)userId withPlace:(GMSPlace *)place 
{ 
    Firebase *ref = [[Firebase alloc] initWithUrl:baseRefUrl]; 

    NSNumber *lat = [NSNumber numberWithDouble:place.coordinate.latitude]; 
    NSNumber *lng = [NSNumber numberWithDouble:place.coordinate.longitude]; 
    NSString *geoHash = [GFGeoHash newWithLocation:place.coordinate].geoHashValue; 

    NSDictionary *locationDetails = @{ @"l" : @[ lat, lng ], @"g" : geoHash}; 

    NSDictionary *update = @{ 
           [NSString stringWithFormat:@"https://stackoverflow.com/users/%@/", userId] : locationDetails 
          }; 

    [ref updateChildValues:update withCompletionBlock:^(NSError *error, Firebase *ref) { 
      // complete 
     }]; 
} 
+0

Невозможно одновременно обновить местоположение GeoFire и сам объект в одном вызове. Вероятно, это можно сделать с помощью одного [обновления нескольких местоположений] (https://www.firebase.com/blog/2015-09-24-atomic-writes-and-more.html), но ни одна из библиотек GeoFire в настоящее время используют эту функцию. –

+0

@FrankvanPuffelen Я вижу, могу ли я использовать свой пример кода и скорее использовать GeoFire для запросов? – Erik

+0

Несомненно. Это должно работать до тех пор, пока вы убедитесь, что вы [устанавливаете те же свойства/приоритеты, что и GeoFire] (https://github.com/firebase/geofire-objc/blob/master/GeoFire/Implementation/GeoFire.m#L83- L108). –

ответ

0

Если вы обновляете словарю:

NSDictionary *locationDetails = @{ 
     @"l" : @[ lat, lng ], 
     @"g" : geoHash, 
     @".priority": geoHash 
    }; 

Вы также будете устанавливать приоритет кивок e, который является (afaik), необходимым для GeoFire.

+0

Я обновляю свой номер Firebase с этой информацией сейчас, но ваш ответ в [этот вопрос] (http://stackoverflow.com/questions/35301799/ geofire-query-on-user-location) говорит, что я должен хранить информацию, связанную с местоположением, отдельно от самого местоположения? – Erik

+0

** Редактировать **: Я вижу, что я все еще могу использовать свое многоосевое обновление, но мне нужно записать местоположение в другое место, чем фактические релевантные данные? – Erik