2015-01-28 2 views
0

У меня есть это приложение, которое использует материал iBeacon. Основываясь на AirLocate, я перечисляю маяки в своем районе.Как предотвратить повторный запуск методов из непрерывных данных?

Это делается в UITableView следующим образом:

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region 
{ 
    self.rangedRegions[region] = beacons; 
    [self.beacons removeAllObjects]; 

    NSMutableArray *allBeacons = [NSMutableArray array]; 

    for (NSArray *regionResult in [self.rangedRegions allValues]) 
    { 
     [allBeacons addObjectsFromArray:regionResult]; 
    } 

    for (NSNumber *range in @[@(CLProximityUnknown), @(CLProximityImmediate), @(CLProximityNear), @(CLProximityFar)]) 
    { 
     NSArray *proximityBeacons = [allBeacons filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"proximity = %d", [range intValue]]]; 
     if([proximityBeacons count]) 
     { 
      self.beacons[range] = proximityBeacons; 
     } 
    } 
    [self.tableView reloadData]; 
} 

оттуда,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

называется.

Здесь я вызываю метод, который запрашивает онлайн-базу данных для значения, определенного для ячейки.

Проблема заключается в том, что диспетчер местоположений отправляет практически непрерывные обновления, заставляя меня многократно отправлять запросы в базу данных для информации, которая не изменяется после первого запроса. После этого я должен обновить интерфейс.

Каков наилучший подход, чтобы избежать этого избыточного запроса?

Я надеюсь, что это имеет смысл

заранее спасибо

S


Вот делегаты Tableview:

- (UITableViewCell *)tableView:(UITableView *)tView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *identifier = @"Cell"; 
    myCell *cell = [tView dequeueReusableCellWithIdentifier:identifier]; 

    NSNumber *sectionKey = [self.beacons allKeys][indexPath.section]; 
    CLBeacon *beacon = self.beacons[sectionKey][indexPath.row]; 

    User * myBuddy = [self retrieveDataFromUserwithMajor:[beacon.major shortValue] andMinor:[beacon.minor shortValue]]; 
    NSString *path=[NSString stringWithFormat:@"http://www.myplace.com/%@.png", myBuddy.userID]; 
    NSURL *url = [NSURL URLWithString:path]; 

    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]]; 
    cell.userSelfie.image=image; 
    cell.userName.text=myBuddy.userName; 
    cell.userSetting2.text=myBuddy.userSetting2; 
    cell.userSetting3.text=myBuddy.userSetting3; 
    } 


    return cell; 

} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return self.beacons.count; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSArray *sectionValues = [self.beacons allValues]; 
    return [sectionValues[section] count]; 
} 

ответ

0

Ваш "не имеет значения логики" на самом деле значение, поскольку скорее всего, это изменяет массив источников данных вашего стола и знает, что чанг es к вашему массиву источников данных помогли бы в формулировании ответа ...

Но, вообще говоря, если didRangeBeacons - это то, где вы меняете источник данных, то вы можете сделать (1) сохранить копию своего текущий массив данных в верхней части метода didRangeBeacons, (2) измените свой массив данных с помощью «логики», затем (3) только перезагрузите данные, если массив источников данных изменился.

Редактировать: Из вашего кода это выглядит как self.beacons - источник данных вашей таблицы, поэтому я обновил код соответствующим образом.

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region 
{ 
    // Save a copy of the original self.beacons dictionary 
    NSMutableDictionary *originalDataSource = [self.beacons copy]; 

    self.rangedRegions[region] = beacons; 
    [self.beacons removeAllObjects]; 

    NSMutableArray *allBeacons = [NSMutableArray array]; 

    for (NSArray *regionResult in [self.rangedRegions allValues]) 
    { 
     [allBeacons addObjectsFromArray:regionResult]; 
    } 

    for (NSNumber *range in @[@(CLProximityUnknown), @(CLProximityImmediate), @(CLProximityNear), @(CLProximityFar)]) 
    { 
     NSArray *proximityBeacons = [allBeacons filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"proximity = %d", [range intValue]]]; 
     if([proximityBeacons count]) 
     { 
      self.beacons[range] = proximityBeacons; 
     } 
    } 

    // If the original dictionary has changed, reload the data 
    if (![originalDataSource isEqualToDictionary:self.beacons] { 
     [self.tableView reloadData]; 
    } 
} 
+0

Спасибо, Lyndsey! Так как я не уверен, как добраться до self.tableDataSourceArray Я включил «нерелевантную логику» в вопрос ...... потенциально из дурака из себя. – Sjakelien

+0

@Sjakelien OK, это определенно помогает ... Я обновлю в секунду ... –

+0

ты персик! – Sjakelien

Смежные вопросы