菜鸟教程小白 发表于 2022-12-12 08:54:45

ios - RestKit本地删除对象,依然出现在mapping中


                                            <p><p>我正在为我的应用程序使用 RestKit 0.20.3。它具有离线模式,所以我必须将对象存储在本地核心数据中。</p>

<p>每当从服务器中删除某些对象时,它会以 JSON 格式发送 <code>deleted = true</code> 属性,我在与 <code>deletionPredicate</code> 的映射中处理该属性。
这是我的 map 。</p>

<pre><code>- (RKEntityMapping *)meetingsMapping {

    RKEntityMapping *meetingsMapping = ;
    meetingsMapping.setDefaultValueForMissingAttributes = NO;
    meetingsMapping.deletionPredicate = ;
    ;
    meetingsMapping.identificationAttributes = @[@&#34;id&#34;];

    [meetingsMapping addAttributeMappingsFromDictionary:@{
                                                      @&#34;id&#34;: @&#34;id&#34;,
                                                      @&#34;title&#34;: @&#34;title&#34;,

                                                      @&#34;start_date_human&#34;: @&#34;start_date_human&#34;,
                                                      @&#34;start_time_human&#34;: @&#34;start_time_human&#34;,
                                                      @&#34;finish_date_human&#34;: @&#34;finish_date_human&#34;,
                                                      @&#34;finish_time_human&#34;: @&#34;finish_time_human&#34;,

                                                      @&#34;lock&#34;: @&#34;lock&#34;,
                                                      @&#34;location&#34;: @&#34;location&#34;,
                                                      @&#34;sample&#34;: @&#34;sample&#34;,

                                                      @&#34;deleted&#34;: @&#34;shouldBeDeleted&#34;,

                                                      @&#34;created_at&#34;: @&#34;created_at&#34;,
                                                      @&#34;updated_at&#34;: @&#34;updated_at&#34;,
                                                      @&#34;follow_up_id&#34;: @&#34;follow_up_id&#34;,
                                                      @&#34;total_topics&#34;: @&#34;total_topics&#34;,
                                                      }];

];
];
];
];
];

return meetingsMapping;
</code></pre>

<p>}</p>

<p>它运行良好,并且从本地 CoreData 中删除了属性。</p>

<p>问题是方法 <code>getObjectsAtPath</code> 仍然返回 <code>mappingResult</code> 参数中的所有对象。</p>

<pre><code>[ getObjectsAtPath:
                                       parameters:nil
                                          success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                              KLog(@&#34;%@&#34;, mappingResult.array); // It is returning all objects, not only non-deleted objects
                                              completionHandler(mappingResult.array, nil);
                                          }
                                          failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                              completionHandler(nil, error);
                                          }];   
</code></pre>

<p>假设如果删除了 20 个对象中的 5 个,则 <code>mappingResult.array</code> 返回 20 条记录而不是 15 条。删除的 5 条记录没有数据。当我记录 <code>mappingResult.array</code> 时,前 5 条记录打印如下:</p>

<pre><code>2014-03-27 13:10:14.105 MeetingKing W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object &lt;DBMeetings: 0xc1cb820&gt; (entity: DBMeetings; id: 0xc1a6a60 &lt;x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809410&gt; ; data: &lt;fault&gt;): the object has a temporary managed object ID.
2014-03-27 13:10:14.105 MeetingKing W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object &lt;DBMeetings: 0xc5b2ed0&gt; (entity: DBMeetings; id: 0xc5d1110 &lt;x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809416&gt; ; data: &lt;fault&gt;): the object has a temporary managed object ID.
2014-03-27 13:10:14.106 MeetingKing W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object &lt;DBMeetings: 0xc58b6a0&gt; (entity: DBMeetings; id: 0xc5d3de0 &lt;x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809417&gt; ; data: &lt;fault&gt;): the object has a temporary managed object ID.
2014-03-27 13:10:14.106 MeetingKing W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object &lt;DBMeetings: 0xc5b50e0&gt; (entity: DBMeetings; id: 0xc5d4af0 &lt;x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809419&gt; ; data: &lt;fault&gt;): the object has a temporary managed object ID.
2014-03-27 13:10:14.107 MeetingKing W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object &lt;DBMeetings: 0xc1ed5a0&gt; (entity: DBMeetings; id: 0xc1c84e0 &lt;x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809422&gt; ; data: &lt;fault&gt;): the object has a temporary managed object ID.
</code></pre>

<p>如果我 checkin 数据库,则只有 15 条记录。没关系。</p>

<p>如果我明确地从数据库中获取,它只返回 15 条记录,没关系</p>

<p>但是在<code>getObjectsAtPath</code>回调中,<code>mappingResult.array</code>参数返回20条记录。那不行。 :(</p>

<p>问题是 <code>mappingResult.array</code> 的 <code>count</code> 变成 20,而我的 <code>UITableView</code> 显示 20 行,其中 5 行没有数据。</p>

<p>RestKit 是否有任何其他回调可以准确返回 15 条记录,这样我就不必从数据库中显式获取记录?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><code>mappingResult</code> 正在返回被映射的对象,这是它应该做的。一些项目随后被删除的事实并没有改变这一点 - 实际上,您拥有所需的所有信息,因为您知道所有已映射的对象以及哪些对象因此被删除。</p>

<p>简单的解决方案是使用 <code>NSFetchedResultsController</code> 来获取表格 View 的数据。它将正确处理更新、插入和删除,您不需要做额外的工作。</p>

<p>或者,您需要迭代 <code>mappingResult.array</code> 并过滤掉已删除的项目。最好的验证方法是使用支票:</p>

<pre><code>if (item.isDeleted || item.managedObjectContext == nil) {
    // remove the now invalid item...
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - RestKit本地删除对象,依然出现在mapping中,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/22682037/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/22682037/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - RestKit本地删除对象,依然出现在mapping中