Мне создали NSFetchedResultsController для заполнения UITableView, базирующегося от моего 'основного' NSManagedObjectContext.
В таймере я постоянно добавляю объекты в отдельный NSManagedObjectContext, но тот, который совместно использует его NSPersistantStoreCoordinator с основным контекстом.
Я вижу, что уведомления NSManagedObjectContextWillSaveNotification отправляются, и когда я вышел из перезапуска приложение, у меня есть все данные из предыдущего выполнения. Однако никаких обновлений не происходит с текущим NSFetchedResultsController.
Я создал тестовый проект и поместил его сюда.
(Я первоначально думал, что это происходило из-за того, чтобы там быть несколькими потоками в действии; однако, это происходит, когда все сделано в одном потоке).
Исходный вопрос
Мне создали NSFetchedResultsController для заполнения UITableView, базирующегося от моего 'основного' NSManagedObjetContext.
В фоновом потоке я загружаю и импортирую несколько объектов в отдельный NSManagedObjectContext, но тот, который совместно использует его NSPersistantStoreCoordinator с контекстом основного потока.
Я регистрируюсь для получения уведомлений NSManagedObjectContextWillSaveNotification. Когда я получаю их, я передаю им на основном потоке и передаю их своему основному контексту.
Используя отладчик, я могу наблюдать, что они входят и проверяют, что, действительно, добавляют объекты к контексту. Однако мой NSFetchedResultsController не обновляет. Если я делаю это все в основном потоке, он действительно работает. Вызов-performFetch: на контроллере заставит это обновлять, таким образом, я знаю не то, чтобы это не видит новые объекты.
Большая часть из этого является шаблонным кодом, просто разделенным на различные потоки.
синтаксис ваших программ, или для этого многие другие вещи, такие как естественные языки, могут быть проанализированы с помощью двоичного дерева (хотя и не обязательно).
-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)»
.
Получаете ли вы какие-либо обратные вызовы от NSFetingResultsController? Если нет, это может быть ошибка с самим NSFetingResultsController. Я бы рекомендовал создать тестовый проект, который может подтвердить/опровергнуть эту проблему изолированно.
Если вы можете дублировать его изолированно;
После просмотра кода ответ состоит в том, чтобы изменить наблюдателя уведомления с NSManagedObjectContextWillStartNotification
на NSManagedObjectContextDidStartNotification
. Сообщение было отправлено только до сохранения, вызвавшего неполадки.