Ios 实例化可选领域对象的线程安全方式

Ios 实例化可选领域对象的线程安全方式,ios,swift,swift3,realm,Ios,Swift,Swift3,Realm,我试图做的是设置一系列AVPlayer,这些播放器可以通过实例变量访问。所有内容都存储在Realm中,我在前面的视图中用所有Realm变量实例化了集合。一旦视图加载,我想加载所有的播放器,然后使用location中的一些参数触发它们。问题是,当调用locationManager时,播放器在播放器实例上返回nil 我猜这是因为locationManager在一个单独的线程上被调用?如果是这样的话,线程安全的方法是什么来确保玩家已经被实例化 这是带有locationManager和加载程序的视图 c

我试图做的是设置一系列AVPlayer,这些播放器可以通过实例变量访问。所有内容都存储在Realm中,我在前面的视图中用所有Realm变量实例化了集合。一旦视图加载,我想加载所有的播放器,然后使用location中的一些参数触发它们。问题是,当调用
locationManager
时,播放器在播放器实例上返回
nil

我猜这是因为
locationManager
在一个单独的线程上被调用?如果是这样的话,线程安全的方法是什么来确保玩家已经被实例化

这是带有
locationManager
和加载程序的视图

class WalkMapViewController: UIViewController, CLLocationManagerDelegate, GMSMapViewDelegate {
    /* …lots of outlets */
    var collection:Collection!

    override func viewDidLoad() {
        /* …lots of other init stuff */
        self.loadPlayers()
    }

    func loadPlayers() {
        // get a url from somewhere
        for (i,_) in self.collection.players.enumerated() {
            // loop through the players and load them
            self.collection.players[i].player = AVPlayer(url: url)
        }
    }

    func locationManager(_ manager:CLLocationManager, didUpdateLocations locations:[CLLocation]) {
        for (i, _) in self.collection.players.enumerated() {
            self.collection.players[i].play()
        }
    }
}
这是一个大大缩短的集合类,它是一个领域对象,在ignoreProperties中有
players

class Collection: Object, Mappable {
    var players = List<Player>()
}

问题的存在是因为您使用的是被忽略的属性,而这些属性不是由
领域
持久化的。根据GitHub关于被忽略属性的问题,您所经历的是预期的行为

从相关问题来看:

“被忽略的属性仅保证在所有 单个Swift实例,但从集合中检索对象 每次创建一个新的Swift实例,因此 看。”

这意味着
locationManager(didUpdateLocations:)
中的
self.collection.players[i]
实际上是您在
loadPlayers()
中创建的同一
Realm
对象的一个新Swift实例,这与正常的
Realm
属性无关,由于它们是从
领域
数据库中获取的,但由于它们链接到特定的
Swift
实例且仅存在于内存中,因此会导致忽略属性的问题。因此,当您从集合(
Player
instance from`List')检索特定对象时,所有被忽略的属性都将丢失


总而言之,您将无法在集合中使用被忽略的
Realm
属性。

这很可能与线程无关,如果您试图从另一个线程访问
Realm
对象,您将得到一个错误,而不是一个nil对象。是这一行:
self.collection.players[i].play()
返回零吗?是的@DávidPásztor,正确。在
loadPlayers()
范围内,可以访问播放机。遗憾的是,这是预期的行为,正如我所怀疑的,它与线程无关,而是与忽略的属性有关。下面是我的答案,有一个完整的解释。精彩的,优雅的总结。谢谢你解决了这个问题。这可能是一个风格问题,但在您看来,存储AVP播放器的最佳方式是什么?作为视图上的一个属性(可能作为一个带有对播放器的引用的字典)?谢谢:)很高兴我能提供帮助,这实际上是一个关于领域的有趣的实现问题,所以我很高兴我遇到了您的问题并进行了研究。没有一种好的方法可以解决这个问题,但是是的,将AVPlayer存储为视图控制器的属性似乎是一个不错的解决方案。您是将它们存储在字典中还是存储在数组中(因为您将它们存储在域中的列表中,数组似乎是自然的选择)完全取决于您。只要决定哪种方法更容易(通过索引还是通过键)来查找AVPlayer实例,然后执行该实现。我被
领域
文档带到了花园里,这些文档说ignoredProperties在各个方面都是绝对正常的属性。感谢您对实现的帮助,我可能会将它们放在一个单独的视图中,因为我需要它们在其他视图中。是的,文档在这个特定的主题中有点误导。在查找GitHub问题之前,我也查看了文档,这些文档在这个问题上没有提供任何帮助。
class Player: Object, Mappable {
    var player:AVPlayer?
}