2015-04-06 5 views
0

Я передаю объект из моего UITableViewController в singleton, а затем обратно в свой UITableViewController через уведомление. UITableViewController использует NSFetchedResultsController. Затем он хочет, чтобы indexPath объекта находился в fetchedResultsController.indexPathForObject возвращает nil

Object *obj = (Object *)notification.object; 
NSIndexPath *index = [self.fetchedResultsController indexPathForObject:obj]; 

Я установил уведомление в ходе блока AFNetworking/AFDownloadRequestOperation:

- (void)downloadObject:(Object *)object 
{ 
........ 

    [operation1 setProgressiveDownloadProgressBlock:^(AFDownloadRequestOperation *operation, NSInteger bytesRead, long long totalBytesRead, long long totalBytesExpected, long long totalBytesReadForFile, long long totalBytesExpectedToReadForFile) { 
         ////// Sending Notification 
         ////// Try to send notification only on significant download 
         totalBytesRead = ((totalBytesRead *100)/totalBytesExpectedToReadForFile); 
         NSLog(@"TOTAL BYTES IN PROGRESS BLOCK: %llu",totalBytesRead); 
         NSMutableDictionary *userDictionary = [[NSMutableDictionary alloc]init]; 
         [userDictionary setObject:[NSNumber numberWithLongLong:totalBytesRead] forKey:@"progress"]; 
         [userDictionary setObject:[NSNumber numberWithLongLong:totalBytesExpectedToReadForFile] forKey:@"totalBytes"]; 
         [[NSNotificationCenter defaultCenter] postNotificationName:[NSString stringWithFormat:@"DownloadProgress%@",object.uniqueID] object:object userInfo:userDictionary]; 
} 

Существует только один объект в [self.fetchedResultsController fetchedObjects]; и соответствует объект, принятый еще в уведомлении. index всегда равен нулю, но fetchedResultsController не равен нулю, а [self.fetchedResultsController fetchedObjects] возвращает правильный объект. Почему indexPathForObject nil?

+1

Я не знаю, но как вы передаете звук данных ** УЖАСНЫЙ **. В любом случае: попробовали ли вы использовать метод indexOfObject: 'int the' fetchedObjects', чтобы точно убедиться. Если это все равно возвращает ноль, тогда ваш код делает что-то неправильно, а объекты * - разные. – luk2302

+0

Почему это звучит ужасно? У меня есть мой синглтон, отправляющий уведомление, которое мои другие классы слушают, чтобы обновить ход загрузки на моем UITableViewCells. Это обновляет все мои представления в моем TabBar, где использование делегата не обновлялось в моем приложении. Есть ли способ лучше? Я проверю, являются ли объекты одинаковыми. – Siriss

+0

Синглтон почти всегда плох, его следует избегать практически любой ценой. Может быть, использовать указанную делегацию или сильно, поддерживая Objective-C KVO. Но отправка данных с A на B на C, чтобы вернуть их в A, не похожа на прочный дизайн. – luk2302

ответ

0

кажется мне, как вы пытаетесь найти объект в виде таблицы из объекта уведомления ...

Вы должны вызвать метод индекса пути на ваш табличный объекте, а не ваш объект уведомления.

Попробуйте соответствие вашей локальной переменной:

Object *obj = (Object *)notification.object; 

с:

[self.fetchedResultsController fetchedObjects]; 

(если это только один, который должен быть относительно легко) ...

NSArray *arrayFetchedObjects = [self.fetchedResultsController fetchedObjects]; 
Object *tableObject = [arrayObjects lastObject]; 

(если есть более одного, то вам может понадобиться отфильтровать arrayFetchedObjects, но это другой вопрос)

затем местонахождение положение этого извлеченной объекта в виде таблицы:

NSIndexPath *indexPath = [self.fetchedResultsController indexPathForObject:tableObject]; 
+1

Это не исправить. Я понял проблему, и это было связано с сортировкой моего раздела. Индекс объекта был равен нулю, поскольку он был помещен в неназванный раздел. Я не видел ошибок, пока не начал возиться с подобными. – Siriss

2

У меня была такая же проблема. В конфигурации моего NSFetchedResultsControllersectionNameKeyPath был установлен для ссылки на (необязательный) связанный объект. Оказалось, что это соотношение должно выполняться (то есть связанный объект не должен быть nil). Убедившись, что все отношения sectionNameKeyPath выполнены, метод indexPathForObject работал снова, как ожидалось.

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