0

我在本地(没有任何云同步)使用 Realm(10.1.3)来处理原生项目(0.63.3)。为了防止内存泄漏,我需要在使用 Realm 实例后关闭它们。但是我一次又一次地遇到同样的错误(见标题),但我不知道如何顺利​​解决它。

我写了一些示例代码:两个屏幕,都显示文章(图像,文本......)

重现它的步骤(参见下面的代码):

  1. 打开屏幕2(新)
  2. 打开屏幕1(新)
  3. 关闭屏幕1
  4. 转到 Screen2(已打开,从 Screen History 中调用)
  5. 调用方法getArticleTitle()

屏幕:

export class Screen1 extends React.Component {

    // ... 

    componentWillUnmount(){
        this.freeUpMemory()
    }

    async freeUpMemory(){
        await RealmProvider.closeScreen1Realm()
    }
}

export class Screen2 extends React.Component<any, {article: Article | null}> {

    constructor(props:any) {
        super(props)
        this.state = {
        article : null
        }
    }

    // this method always works, no matter whether realmScreen1 was destroyed or not
    async loadArticle() {
        var article = await RealmProvider.readArticleForScreen2()
        this.setState({article : article})
    }

    // THIS METHOD CRASHES if:
    // A user has been in Screen1 before and closed it -> realmScreen1 was destroyed
    // AND loadArticle() wasn't called AGAIN
    getArticleTitle(): string {

        let title = "Sample call on Article object"

        if(this.state.article){
            title = this.state.article.articleTitle
        }

        return title
    }
}

似乎两个领域实例都对“Article”对象趋向,而不是“Article”对象对实例趋向。这就是我访问领域对象的方式:

// there is a Realm for each screen
var realmInstanceScreen1:       Realm | null
var realmInstanceScreen2:       Realm | null

const realmConfig = { schema: [ArticleSchema] }

export class RealmProvider {

    // after Screen1 is unmounted, the Realm will be closed 
    static closeScreen1Realm(){
        if (realmInstanceScreen1 && !realmInstanceScreen1.isClosed) {
            realmInstanceScreen1.close()
            realmInstanceScreen1 = null
        }
    }

    // Screen1 operates on its own realmInstance
    static async readArticleForScreen1() : Promise<Article> {
        
        if (!realmInstanceScreen1 || realmInstanceScreen1.isClosed ) {
            realmInstanceScreen1 = await Realm.open(realmConfig)
        } 
        
        let articlesRef = <Article> <unknown>  realmInstanceScreen1.objects("Article")
        return articlesRef
    }

    // Screen2 operates on its own realmInstance
    static async readArticleForScreen2() : Promise<Article> {
        
        if (!realmInstanceScreen2 || realmInstanceScreen2.isClosed ) {
            realmInstanceScreen2 = await Realm.open(realmConfig)
        } 
        
        let articlesRef = <Article> <unknown>  realmInstanceScreen2.objects("Article")    
        return articlesRef
    }
}

谁能向我解释如何清理 Screen1 的 Realm 实例而不会在 Screen2 中遇到任何问题?

目前,我只是将函数包装getArticleTitle()到 try/catch 块中,并在发生错误时重新加载领域,但这似乎很老套。如果我将类重写为函数组件,我也总是可以重新加载 useFocusEffect 上的文章。但我希望对为什么会发生此错误以及如何顺利分离应用程序的这两个部分的概念有所了解。任何帮助表示赞赏。

4

0 回答 0