2
が表示されます。私の理解では、fetchBoard()
とinitUserInfo()
は並行して実行されません。 (表示としては、fetchBoard()
がボードをロードするときにのみロードされます) DispatchQueue.main.async
を複数回使用するとビューがフリーズしてしまうのではないかと心配です。また、どうすればスムーズに動作させることができますか?複数のDispatchQueue.main.asyncを使用してフリーズすると、
class MultipleCardsController2vs2: BaseController, UICollectionViewDataSource , UICollectionViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let repo = GameRepository()
repo.CreateGame(gameID : self.jsonGame.Id , completion: { (jsonGame, err) -> Void in
if(err == ErrorCode.NoError){
DispatchQueue.main.async{
self.jsonGame = jsonGame
}
}
})
//These are the two functions I want these 2 to work in parallel
self.fetchBoard() //Function 1
self.initUserInfo() //Function 2
collectionView.delegate = self
collectionView.dataSource = self
} // .viewDidLoad
func fetchBoard(){
let repo = GameRepository()
self.sortedBoardArr.reserveCapacity(self.BoardArr.count)
let serialQueue = DispatchQueue(label: "serialQueue")
let group = DispatchGroup()
for board in self.jsonGame.boards{
group.enter()
serialQueue.async {
repo.GetBoardInfo(gameID: self.jsonGame.Id, boardID: board , completion : {(response , errorCode) -> Void in
if errorCode == ErrorCode.NoError{
self.BoardArr.append(response)
group.leave()
}
})
DispatchQueue.main.async{
//Main async - 1
group.wait()
self.sortArr()
self.collectionView.reloadData()
}
}
}
}
func sortArr(){
if self.jsonGame.boards.count == self.BoardArr.count{
for board in self.jsonGame.boards{
for boardarr in self.BoardArr{
if boardarr.id == board{
self.sortedBoardArr.append(boardarr)
}
}
}
}
}
fileprivate func initUserInfo()
{
DispatchQueue.main.async{
//Main async - 2
self.name1.text = self.CurrentUser.UserName
self.imgPlayie1.image = UserManager.GetAvatar(user: self.CurrentUser)
}
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.jsonGame.boards.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
var cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Round2Cell", for: indexPath) as! Round1vs1cell
cell.background.backgroundColor = UIColor(white: 1, alpha: 0.0)
cell = self.populateGameCell(game_res, cell , indexPath)
return cell
}
fileprivate func populateGameCell(_ game_res: Game_Res, _ cell: Round1vs1cell , _ indexPath : IndexPath) -> Round1vs1cell
{
DispatchQueue.main.async {
//Main async - 3
cell.background.backgroundColor = UIColor(white: 1, alpha: 0.0)
cell.word_1.text = game_res.words[0].word
cell.color_1.image = UIImage(named: "")
cell.life_1.image = UIImage(named: "")
cell.name.text = ""
cell.op_name.text = game_res.master[index].username
cell.timeout_left.image = UIImage(named: "Hourglass.png")
cell.round.text = "Round: \(indexPath.row + 1)"
}
return cell
}
}
ビューをフリーズしていないことを確認します。私はDispatchと一緒に働いているときのことに就いている。どんな助けも歓迎です。前もって感謝します。
魅力的な作品です。ありがとう :) – Prateekro