查看与多个DispatchQueue.main.async使用冻结
当数据被提取并显示时, 查看冻结 。 在我的理解fetchBoard()
和initUserInfo()
不是并行执行。 (因为view只在fetchBoard()
加载板子时加载)我担心多次使用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合作。 任何帮助是受欢迎的。 提前致谢。
使用notify()
而不是wait()
不会阻塞主线程。
游乐场的例子:
import PlaygroundSupport func longRunningTask(completion: () -> Void) { sleep(1) completion() } func foo(){ let queue = DispatchQueue(label: "myQueue") let group = DispatchGroup() let array = [1, 2, 3] for i in array { print(i) group.enter() queue.async { longRunningTask { print("done \(i)") group.leave() } } } group.notify(queue: DispatchQueue.main) { print("done!") } } foo() PlaygroundPage.current.needsIndefiniteExecution = true
打印:
1 2 3 done 1 done 2 done 3 done!
- 即使在dispatch_async上,UILabel也不会更新
- 如何解决在这个区块强烈的“捕捉”区块可能会导致一个保留周期“
- iOS中的NSOperation – 如何处理循环和嵌套的NSOperation调用来获取图像
- 在iOS中的UITableViewasynchronous图像加载的build议
- swift:asynchronous任务+完成
- 在iOS中使用进度报告取消一组asynchronous操作
- dispatch_async UIWebView的loadrequest
- 与NSURLSessionasynchronous上传将无法正常工作,但同步NSURLConnection不会
- 简单的asynchronous图像下载UIImage视图