LazyMapSequence 在字符串数组除外时的用法

Usage of LazyMapSequence when an array of Strings is excepted

提问人:iOSGeek 提问时间:5/30/2020 最后编辑:iOSGeek 更新时间:5/31/2020 访问量:414

问:

我有一个 User 对象

@objc(User)
public class User: NSManagedObject {
    @NSManaged public var firstname: String
    @NSManaged public var lastname: String
    @NSManaged public var country: String
    @NSManaged public var friends: NSSet // of User objects

    var full: String {
        firstname + " " + lastname
    }

    var friendsArray: [User] {
        friends.allObjects as? [User] ?? []
    }
}

在某些时候,我想将大量用户(80k 对象)映射到一组 View 模型

struct ItemViewModel: Hashable {
    let id: UUID
    let friendsName: [String] 
}

没有懒惰需要很长时间,所以我选择了懒惰的usag:

func prepareViewModel(users: [User]) -> [ItemViewModel] {
    users.map { user in
        let friendsName = user.friendsArray.lazy.filter{["en", "fr"].contains($0.country)}.map(\.full)
        return ItemViewModel(id: UUID(), friendsName: friendsName)
    }
}

但是我收到一个错误:

Cannot convert value of type 'LazyMapSequence<LazyFilterSequence<LazySequence<[User]>.Elements>.Elements, String>' 
(aka 'LazyMapSequence<LazyFilterSequence<Array<User>>, String>') to expected argument type '[String]'

这是有道理的,因为现在朋友的名字数组稍后会被懒惰地处理。我试图将视图模型结构转换为保持:

struct ItemViewModel: Hashable {
    let id: UUID
    let friendsName: LazyMapSequence<LazyFilterSequence<[User]>, String>
}

但是现在没有办法在使用 as type 时保持自动一致性,以及有关如何提高逻辑性能的任何提示HashableHashableLazyMapSequence<LazyFilterSequence<[User]>, String>ItemViewModel

iOS Swift 惰性序列

评论

0赞 matt 5/30/2020
惰性序列在这里有什么关系?它不会使耗时的事情进展得更快。在我看来,您想要的是记忆,即在必要时不要将用户转换为视图模型,并记住结果,这样您就不必再次这样做。
0赞 iOSGeek 5/30/2020
@matt希望只有在我们访问 ViewModel 中的属性时才应该执行。理想情况下,是的,我们应该将用户转换为视图模型,直到我必须这样做。但是我需要用可比较的数据源填充 collectionViewuser.friendsArray.lazy.filter{["en", "fr"].contains($0.country)}.map(\.full)friendsName
0赞 matt 5/30/2020
那么懒惰是没有用的。你只需要咬紧牙关,把它们全部转换。如果需要很长时间,您可以在后台线程上执行此操作。但为什么需要很长时间呢?问问自己。
0赞 iOSGeek 5/30/2020
@matt实际上懒惰是有帮助的。使用懒惰时,映射需要 5 秒,但如果没有 12 秒,如果没有朋友映射,则需要 3 秒(注释行和返回和空数组)。但是我需要手动调整 Hashable。但也许懒惰是不够的,或者不是这里的最佳选择。我想到的唯一解决方案是:1.实现集合视图的分页,并按批次映射到视图模型。2. 跳过 viewmodel 的使用,直接使用托管对象。还有其他建议吗?
0赞 matt 5/30/2020
“为集合视图实现分页,并按批处理映射到视图模型” 没错,这就是所谓的预取。它是 UICollectionView 内置的一个选项,这就是我所说的记忆。

答: 暂无答案