菜鸟教程小白 发表于 2022-12-12 23:49:11

ios - iOS 核心数据 transient 如何工作?


                                            <p><p>我正在尝试了解 iOS Core 数据 transient 属性,但无法理解某些行为。</p>

<p><strong>设置</strong></p>

<p>我有两个上下文,一个主上下文和一个私有(private)上下文。我称它们为 mainContext 和 threadedContext 。</p>

<p>线程上下文是父上下文,主上下文是子上下文。 (我这样做是因为我的线程上下文比我的主线程和 UI 更频繁地更改模型。</p>

<p>我有需要通过上下文传递的 transient 属性。</p>

<p>我发现有时我会失去值(value),有时我并不依赖于我的运作方式。</p>

<p><strong>示例</strong></p>

<p>此代码已被简化以显示问题。我有一个 Person 对象。 Person 对象有一个名为“other”的临时实体,您将看到我为它分配了一个具有几个简单属性的 Other 对象,仅此而已。</p>

<pre><code>- (void)case1
{

NSManagedObjectContext *mainThreadContext = .mainThreadContext;
NSManagedObjectContext *threadedContext = .threadedContext;

__block NSManagedObjectID *objectID = nil;

[mainThreadContext performBlockAndWait:^{
    //create
    Person *aPerson = ;

    //setup
    Other *other = [ init];

    aPerson.other = other;

    aPerson.other.favoriteColor = @&#34;Blue&#34;;
    aPerson.other.city = @&#34;Provo&#34;;

    //save
    NSError *error = nil;
    ;

    objectID = aPerson.objectID;

    NSLog(@&#34;%@&#34;,aPerson);

}];   
}
</code></pre>

<p>当我像这样检索对象时,person.other 属性仍然设置(请注意,我在检索对象后保存:</p>

<pre><code>[threadedContext performBlockAndWait:^{
    Person *aPerson = ;

    NSError *threadedError = nil;
    ;

    NSLog(@&#34;threaded %@&#34;, aPerson);
}];
</code></pre>

<p>当我像这样检索对象时,person.other 不再设置(请注意,我在检索对象之前保存)</p>

<pre><code>[threadedContext performBlockAndWait:^{

    NSError *threadedError = nil;
    ;

    Person *aPerson = ;

    NSLog(@&#34;threaded %@&#34;, aPerson);
}];
</code></pre>

<p>我尝试了不同的方法,包括 refreshObject:mergChanges:
我试图观察对象何时出现故障,但这似乎没有帮助。
即使当前没有实例化模型对象, transient 值是否存储在给定的上下文中(假设我已经保存,或者可能没有给出我看到的问题)?</p>

<p>对于那些觉得自己需要更多...
getPersonOnContext:WithID 方法如下所示:</p>

<pre><code>- (Person *)getPersonOnContext:(NSManagedObjectContext *)context withID:(NSManagedObjectID *)ID
{
    __block Person *person = nil;
    [context performBlockAndWait:^{
      person = (Person *);
    }];
    return person;
}
</code></pre>

<p>createAPersonOnContext: 看起来像这样:</p>

<pre><code>- (Person *)createAPersonOnContext:(NSManagedObjectContext *)context
{
    __block Person *person = nil;
    [context performBlockAndWait:^{
      person = (Person *)[NSEntityDescription insertNewObjectForEntityForName:@&#34;Person&#34;
                                                         inManagedObjectContext:context];
      person.firstName = @&#34;matt&#34;;
      person.lastName = @&#34;ZZZ&#34;;
    }];
    return person;
}
</code></pre>

<p>我只是想隐藏这段代码以帮助引起人们对问题本身的关注。</p>

<p>如果你想对此进行实验,我在 github 上有它:<a href="https://github.com/mcmurrym/CoreDataBehaviors" rel="noreferrer noopener nofollow">https://github.com/mcmurrym/CoreDataBehaviors</a> </p>

<p><strong>更新:</strong></p>

<p>看来,当我在使用 ID 检索线程上下文中的对象之前保存时,它会使 Person 对象出错,从而破坏了 transient 值。如果我在保存之前在线程上下文中检索对象,则会保留 transient 值,因为该对象没有出现故障。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>最大功率,</p>

<p> transient 非常简单。它们是后备存储中始终不存在的属性。因此,您看到它们的事实是因为您使用的是子 MOC 并且已经从外部分配了这些值。为确保 transient 始终有效,您需要考虑实现 <code>-awakeFromInsert</code>、<code>-awakeFromFetch</code>、<code>-prepareForDeletion</code>、<code>-didTurnIntoFault </code> 和 <code>-willTurnIntoFault</code> 方法。</p>

<p>安德鲁</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - iOS 核心数据 transient 如何工作?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/13467195/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/13467195/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - iOS 核心数据 transient 如何工作?