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