2015-11-13 2 views
2

Мы используем Realm для кэширования объектов ChatMessage в нашем приложении iOS. Мы также используем Realm для сохранения некоторых других локальных объектов в нашем приложении. Для сообщений чата, когда мы получаем сообщения от PubNub, мы создаем новый локальный объект ChatMessage и записываем его в основную очередь. Для записи других объектов мы выгружаем их в неспецифическую глобальную очередь и помещаем в нее транзакцию записи.Какие могут быть причины ошибок «уже в транзакции записи» для Realm iOS?

В настоящее время мы постоянно испытываем исключения, когда мы написали объекты ChatMessage, указав, что транзакции были «уже в транзакции записи». Я проверил все места, чтобы убедиться, что нет функции, которая запускает beginWriteTransaction в каждом коде beginWriteTransacdtion/commitWriteTransaction. И между этими кодами находятся в основном только изменения объектов или модификаций объектов Realm. Поэтому мы абсолютно не знаем, почему эта ошибка произошла. (Это не очень часто. Обычно 1-3 раза в день.)

Возможно ли, что несколько сообщений из PubNub входят (в основной очереди), вызывает несколько транзакций записи, ведущих к этой проблеме? Или может быть какое-то недоконченное commitWriteTransaction вызывать такой тип проблемы (мы еще не проверяли ошибки транзакции фиксации, я не уверен, что лучший способ обрабатывать ошибки из Realm)? Кроме того, может ли любая транзакция записи не удалась, когда приложения вошли в фон и вызвали такие ошибки?

Спасибо всем очень!

ответ

0

StackOverflow на самом деле не лучшее место для такого рода советов по устранению неполадок (электронная почта [email protected] подходит для этого лучше), но я все равно дам ему шанс.

Код Realm для проверки того, что вы уже находитесь в транзакции записи: dead simple, так что вероятность того, что вы на самом деле выполняете транзакцию вложенной записи, когда вы получаете исключение «уже в транзакции записи».

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

Вы также можете добавить точку останова, которая регистрирует файл &, на котором вызывается звонок -[RLMRealm beginWriteTransaction] или -[RLMRealm writeTransactionWithBlock:].

+0

Спасибо! Я прочитал [контактную страницу] (https://realm.io/contact/), и он предоставляет мне linux stackoverflow, поэтому я разместил здесь вопрос. Я не нахожу способ воспроизвести ошибку, но это происходит несколько раз в день, и это не дает мне понять, как это происходит. –

+0

Можете ли вы поделиться либо своим проектом, либо примером кода, который воспроизводит проблему на [email protected]? Мы будем рады помочь, но этого недостаточно. – jpsim

+0

наши коды становятся довольно сложными, и у меня нет некоторых минимальных копий для образца. Но теперь мы пытаемся переместить транзакции записи в одну последовательную очередь, чтобы проверить, не возникают ли проблемы из-за параллелизма. Большое спасибо! –

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