NSFetchedResultsController, не показывающий обновления от других контекстов

Мне создали NSFetchedResultsController для заполнения UITableView, базирующегося от моего 'основного' NSManagedObjectContext.

В таймере я постоянно добавляю объекты в отдельный NSManagedObjectContext, но тот, который совместно использует его NSPersistantStoreCoordinator с основным контекстом.

Я вижу, что уведомления NSManagedObjectContextWillSaveNotification отправляются, и когда я вышел из перезапуска приложение, у меня есть все данные из предыдущего выполнения. Однако никаких обновлений не происходит с текущим NSFetchedResultsController.

Я создал тестовый проект и поместил его сюда.



(Я первоначально думал, что это происходило из-за того, чтобы там быть несколькими потоками в действии; однако, это происходит, когда все сделано в одном потоке).

Исходный вопрос

Мне создали NSFetchedResultsController для заполнения UITableView, базирующегося от моего 'основного' NSManagedObjetContext.

В фоновом потоке я загружаю и импортирую несколько объектов в отдельный NSManagedObjectContext, но тот, который совместно использует его NSPersistantStoreCoordinator с контекстом основного потока.

Я регистрируюсь для получения уведомлений NSManagedObjectContextWillSaveNotification. Когда я получаю их, я передаю им на основном потоке и передаю их своему основному контексту.

Используя отладчик, я могу наблюдать, что они входят и проверяют, что, действительно, добавляют объекты к контексту. Однако мой NSFetchedResultsController не обновляет. Если я делаю это все в основном потоке, он действительно работает. Вызов-performFetch: на контроллере заставит это обновлять, таким образом, я знаю не то, чтобы это не видит новые объекты.

Большая часть из этого является шаблонным кодом, просто разделенным на различные потоки.

5
задан Ben Gottlieb 29 January 2010 в 04:19
поделиться

1 ответ

синтаксис ваших программ, или для этого многие другие вещи, такие как естественные языки, могут быть проанализированы с помощью двоичного дерева (хотя и не обязательно).

-121--552818-

Edit: я обнаружил в другом ответе, что TextBlock также имеет коллекцию Inlines , к которой можно добавить Run s. Ответ Анваки изобретательно использует присоединенное свойство в качестве своеобразного преобразователя.


У меня была пара идей о том, как к этому подойти. Только один из них будет правильно обрабатывать перенос слов и выполнять обработку символов с различными шрифтами.

Используйте FlowDocumentScrollViewer и свяжите последовательность с ним с помощью StartConverter , который преобразует последовательность в FlowDocument .

<FlowDocumentScrollViewer
    HorizontalScrollBarVisibility="Hidden"
    VerticalScrollBarVisibility="Hidden"
    Document="{Binding MyString, Converter={StaticResource MyConverter}}" />

Можно создать свойства на конвертере для установки обычных свойств Font, которые не могут быть набором на FlowDocumentScrollViewer и должны быть набором на FlowDocument , который создает конвертер. Вероятно, вам также понадобятся некоторые свойства Font для подстрок исключений, которым требуется другой Font (и, возможно, другой размер). Другой вариант - создание Binding в FlowDocument для некоторых из этих свойств ( RelativeSource ).

И вот как вы создаете FlowDocument в коде:

FlowDocument doc = new FlowDocument();
doc.FontFamily = new FontFamily( "Our Own Font" );
Paragraph par = new Paragraph();
doc.Blocks.Add( par );

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

Добавьте обычную подстроку в абзац:

Run r = new Run( substring );
par.Inlines.Add( r );

Добавьте специальную подстроку в абзац с другим шрифтом:

Run r = new Run( substring );
r.FontFamily = new FontFamily( "Arial" );
par.Inlines.Add( r );

Приведенные выше фрагменты являются лишь небольшими. Я не знаю, как вы хотите перейти к разделению последовательности или итерации по подстрокам, так как я не знаком с данными, поэтому я не предоставил метод, который я шлепнул вместе, только чтобы увидеть, будет ли моя идея работать. Можно также использовать словарь для обнаружения одной подстроки и использования замены в выходных данных, например, обнаружение «(SM)» и замена его на «℠» .

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

(Хорошо, что вы сказали, что он доступен только для чтения. RichTextBox не будет работать, поскольку его свойство Document не является свойством DependencyProperty и поэтому не может быть целью Binding . Хотя можно использовать Режимы = OneWayToSource для его отмены, реализация ConvertBack вместо Convert .)


«Я думаю, что то, что вы оставили без внимания (итерация над последовательностью и создание этих прогонов), является сложной частью».

Я действительно был очень краток о разделении последовательности на Когда я сказал: "Я не знаю, как ты разделишь последовательность,"Я не говорил, что вообще понятия не имею, как это сделать (я перефразировал это), но я понятия не имел, как вы захотите с этим справиться. Я предполагал, что вам не будет трудно разобраться в этой части, потому что это та проблема манипуляции последовательностями, которую я мог бы решить потенциальным нанимателям. Это, и вы можете обнаружить пограничные случаи среди ваших данных, которые требуют изменений в том, как вы обрабатываете их.

Я опишу относительно грубую версию, используя IndexOf () и Substring () .

Итак, вот проблема-внутри-проблемы: У вас есть много последовательности (например, «Название компании (R), создатели продукта (TM)» ), которые содержат 0 или более специальных подстрок. Эти подстроки малы и известны, и входная последовательность должна быть разделена на несколько последовательностей, где специальные и неспецифические подстроки изолированы друг от друга (например, {«Название компании», «(R)», «Создатели продукта», «(TM)»} ).

Специальные подстроки малы и известны, поэтому вам нужен их массив. По возвращаемому значению .IndexOf () известно, нашла ли она подстроку или нет. Закольцовывая известные специальные подстроки, можно найти первый экземпляр любой из них с помощью сравнения индексов, отложив длину подстроки.

Каждый раз, когда вы находите самую раннюю специальную подстроку в последовательности S (если есть), вы делаете производные последовательности A , B и C . B - специальная подстрока, A и C - до и после. Добавьте A и B к списку , и C станет новым S , и вы снова это сделаете. За исключением случаев, когда в S нет специальных подстрок, и она не пуста, и в этом случае вы просто добавляете ее целиком.

Теперь каждая нечетно индексированная последовательность в списке List является специальной подстрокой. Вы можете сослаться на мое упоминание словаря в предыдущей части этого ответа для использования в качестве подстановки для добавления Run из «℠» , когда найденная подстрока была «(SM)» .

-121--4435233-

Получаете ли вы какие-либо обратные вызовы от NSFetingResultsController? Если нет, это может быть ошибка с самим NSFetingResultsController. Я бы рекомендовал создать тестовый проект, который может подтвердить/опровергнуть эту проблему изолированно.

Если вы можете дублировать его изолированно;

  1. Я бы с удовольствием посмотрел:)
  2. Подайте радар в Apple.

После просмотра кода ответ состоит в том, чтобы изменить наблюдателя уведомления с NSManagedObjectContextWillStartNotification на NSManagedObjectContextDidStartNotification . Сообщение было отправлено только до сохранения, вызвавшего неполадки.

11
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: