2015-02-06 2 views
0

у меня есть это определение Realm модели:App падает или зависает при анализе моделей Realm

class PSTChatThread: RLMObject { 
    dynamic var channelName = "" 
    dynamic var environment = RLMObject(object: PSTChannelEnv.className()) 
    dynamic var chatMessages = RLMArray(objectClassName: PSTMessage.className()) 
} 

class PSTChannelEnv: RLMObject { 
    dynamic var associatedPlaceId = 0 
    dynamic var chattingWithUuid = "" 
    dynamic var chattingWithUsername = "" 
    dynamic var hasSessionEnded = false 
    dynamic var unreadMessages = 0 
} 

class PSTMessage: RLMObject { 

    // type 
    dynamic var typeRaw = "" 
    var type: PSTProtocolMsgTypes { 
     get { 
      if let a = PSTProtocolMsgTypes(rawValue: typeRaw) { 
       return a 
      } 
      return .ChatMsg 
     } 
    } 

    // envelope 
    dynamic var channel = "" 
    dynamic var timeoken = 0 

} 

class ChatMsg: PSTMessage { 
    dynamic var msgId = "" 
    dynamic var text = "" 
    dynamic var username = "" 
    dynamic var uuid = "" 
    dynamic var associatedPlaceId = -1 
} 

class ACKMsg: PSTMessage { 
    dynamic var forId = "" 
    dynamic var uuid = "" 
} 

class UserTypingMsg: PSTMessage { 
    dynamic var uuid = "" 
} 

class UserStoppedTypingMsg: PSTMessage { 
    dynamic var uuid = "" 
} 

class SessionUpdateMsg: PSTMessage { 
    dynamic var hasSessionEnded = false 
    dynamic var uuid = "" 
} 

class ContactDetailsMsg: PSTMessage { 
    dynamic var accessLevel = -1 
    dynamic var uuid = "" 
} 

class ReadReceiptMsg: PSTMessage { 
    dynamic var uuid = "" 
} 
  • Когда я запустить приложение, он выходит из строя в: prop.column = table.add_column_link(tightdb::DataType(prop.type), prop.name.UTF8String, *linkTable); с EXC_BAD_ACCESS
  • В предположении, что модели являются разбирает сверху вниз, если я перемещаю PSTChatThread на дно, приложение просто зависает. Никакой сбой или что-то еще, просто становится невосприимчивым.

Похоже, что существует некоторая проблема с определением PSTChatThread. Если это закомментировано, все работает нормально.

Это происходит, когда я делаю вызов RMRealm или любой другой запрос вызова к моделям.

В случае моей логики подкласса я хотел бы задать еще одну вещь. Есть ли способ, которым PSTMessage не сохраняется в схеме, но только его подклассы?

Благодаря

ответ

1

Проблема с этой линии

dynamic var environment = RLMObject(object: PSTChannelEnv.className()) 

Он просто должен быть

dynamic var environment: PSTChannelEnv 

Причина мы имеем objectClassName ... потому, что вы создаете массив Тип objectClassName. Когда вы выполняете взаимные отношения, вы уже знаете класс объекта, поэтому вы можете напрямую установить тип.

Вот еще документы на setting up your models in Realm

Мы должны бросить ошибку, хотя, когда вы пытаетесь сделать что-то вроде этого. Спасибо что подметил это!

+0

Спасибо, приятель, это очень полезно. У вас есть ответ для моего подтекста? А именно, если я могу избежать включения суперкласса 'PSTMessage' в качестве таблицы в схему. – Thanos

+0

На данный момент пустые таблицы не влияют на производительность. Не могли бы вы объяснить немного больше, почему вы хотите избежать его в схеме? – yoshyosh

+0

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