菜鸟教程小白 发表于 2022-12-12 11:33:55

ios - 从 CoreData 上的不同属性中获取前 1


                                            <p><p>您好,我有一个格式如下所示的表格。 </p>

<p>我想建立一个历史 View ,所以我需要来自不同用户的最新消息,按时间戳排序!</p>

<p><code>
+---+-------+-------+----- ----------+
| |用户名 |留言 |时间戳 |
+---+-------+-------+----- ----------+
| 1 |约翰 |你好 | 486380161.723 |
| 2 |马克 |电子表格 | 486380264.723 |
| 3 |约翰 |仅供引用 | 486380366.723 |
| 4 |约翰 |再见 | 486557497.271 |
| 5 |马克 |你好吗? | 486557597.274 |
| 6 |马里奥 |什么? | 486558597.274 |
+---+-------+-------+----- ----------+
</code></p>

<p>这就是我应该得到的结果。</p>

<p><code>
+---+-------+-------+----- ----------+
| |用户名 |留言 |时间戳 |
+---+-------+-------+----- ----------+
| 6 |马里奥 |什么? | 486558597.274 |
| 5 |马克 |你好吗? | 486557597.274 |
| 4 |约翰 |再见 | 486557497.271 |
+---+-------+-------+----- ----------+
</code></p>

<p>现在,我正在获取所有不同的 <code>username</code>,迭代每个并查询该用户名的消息,按时间戳排序,使用 <code>limit(1)</code>。</p>

<p>我对这个解决方案不满意,所以任何人都可以帮助我找到更好的解决方案吗?</p>

<p>谢谢,
马里奥</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>可以分两次提取,但有一点我会在谈到它时提及。</p>

<p>第一次获取获取每个用户名和最近的时间戳:</p>

<pre><code>    let maxTimestampRequest = NSFetchRequest(entityName: &#34;Entity&#34;)
    maxTimestampRequest.resultType = .DictionaryResultType

    let maxTimestampExpression = NSExpression(format: &#34;max:(timestamp)&#34;)
    let maxTimestampExpressiondescription = NSExpressionDescription()
    maxTimestampExpressiondescription.name = &#34;maxTimestamp&#34;
    maxTimestampExpressiondescription.expression = maxTimestampExpression
    maxTimestampExpressiondescription.expressionResultType = .DoubleAttributeType

    maxTimestampRequest.propertiesToFetch = [&#34;username&#34;, maxTimestampExpressiondescription]
    maxTimestampRequest.propertiesToGroupBy = [&#34;username&#34;]
</code></pre>

<p>执行该提取,您将获得一个字典数组。每个字典都包含一个用户名和该用户名的最新时间戳:</p>

<pre><code>Optional([{
    maxTimestamp = &#34;486557497.271&#34;;
    username = John;
}, {
    maxTimestamp = &#34;486558597.274&#34;;
    username = Mario;
}, {
    maxTimestamp = &#34;486557597.274&#34;;
    username = Mark;
}])
</code></pre>

<p>获取完整记录需要第二次提取。如果上一次 fetch 的结果在一个名为 <code>results</code> 的数组中,</p>

<pre><code>    var predicates = ()
    for maxTimestampInfo in results! {
      let username = maxTimestampInfo[&#34;username&#34;]!
      let timestamp = maxTimestampInfo[&#34;maxTimestamp&#34;]!
      let partialPredicate = NSPredicate(format: &#34;username=%@ and timestamp=%@&#34;, argumentArray:[ username, timestamp ])
      predicates.append(partialPredicate)
    }
    let completePredicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates)

    let fetch = NSFetchRequest(entityName: &#34;Entity&#34;)
    fetch.predicate = completePredicate
</code></pre>

<p>执行 <strong>that</strong> 提取,您将获得符合您要求的完整托管对象。</p>

<p>需要注意的是,第二次提取中的谓词可能非常大,具体取决于您拥有的用户数量。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 从 CoreData 上的不同属性中获取前 1,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37730879/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37730879/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 从 CoreData 上的不同属性中获取前 1