Сообщение от отладчика: прекращено из-за проблемы с памятью для цикла - PullRequest
0 голосов
/ 12 января 2019

Я новичок в Свифте. Мое приложение имеет базу данных SQLite, две таблицы, настраиваемое представление коллекции, настраиваемую ячейку представления коллекции. В ячейке представления коллекции, в которой одна кнопка выполняет действие добавления, удаления и включения.

Кнопка «Добавить» - обновить таблицу, используя «TRUE» Кнопка «Удалить» - обновить таблицу с «ЛОЖЬ» Кнопка «Включить» - обновить таблицу с «TRUE_WITH_PROFILE»

Сначала в viewDidLoad () я извлекаю записи из базы данных и перезагружаю представление коллекции для отображения данных. У меня возникают проблемы с памятью при прокрутке представления коллекции.

    override func viewDidLoad() {
            super.viewDidLoad()

          //——code.—//
                  profilesArray = masterDBObjprofile.retriveMsterData(fromDB: "PROFILE", withGroupName: groupname)

}

Во-вторых, когда я нажимаю кнопку добавления определенной ячейки, она обновляет родительскую таблицу и связанную дочернюю таблицу. Для этого я использую цикл for для получения данных следующим образом.

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        self.customCell = collectionView.dequeueReusableCell(withReuseIdentifier: "HomeViewCell", for: indexPath) as? HomeViewCell

        self.customCell!.configureCell(imageName: self.profileImageArray[indexPath.row] as! Array<TCMasterImageDB>, cell: self.customCell!, forItemAtIndexPath: indexPath, profileDB: self.profilesArray[indexPath.row])


        self.customCell!.addToCartBtn.tag = (indexPath.row)
        self.customCell!.addToCartBtn.addTarget(self, action: #selector(self.myProfileCartAction), for: UIControlEvents.touchUpInside)

        return customCell! // return your cell
    }


func addToCartWith(indexPath : IndexPath) -> Void {
        print("start add to cart")
        DispatchQueue.global(qos: .background).async {
            [weak self] in
            guard let strongSelf = self else { return }
            let masterDB = TCMasterDB()
            let masterChildDB = TCMasterChildDB()
            guard let selectedMasterDBObj = strongSelf.profilesArray[(indexPath.row)] as? TCMasterDB else {return}

            if selectedMasterDBObj.typeString == "PROFILE"{
                masterDB.addTestToCartString = "TRUE"
                masterDB.updateToCart(fromMasterDB: selectedMasterDBObj.codeString, withType: selectedMasterDBObj.typeString)

                //User select profile cart from the book test list
                //1. Based on that need to get profile related child objest form local DB
                guard let profileChildArray = masterChildDB.retriveChildData(fromDB: selectedMasterDBObj.typeString, withCode: selectedMasterDBObj.codeString) else {return}

                //2. Compare existed profile child array data from tests master DB
                for childObj in profileChildArray{
                    autoreleasepool {
                        guard let masterTestDBObj: TCMasterDB = masterDB.retriveMasterTestData((childObj as! TCMasterChildDB).chldCodeString) else {return}
                        if masterTestDBObj != nil{
                            if masterTestDBObj.codeString.count != 0 && masterTestDBObj != nil{
                                masterDB.addTestToCartString = "TRUE_WITH_PROFILE"
                                masterDB.updateToCart(fromMasterDB: masterTestDBObj.codeString, withType: masterTestDBObj.typeString)
                            }
                        }
                    }
                }

            }else{
                masterDB.addTestToCartString = "TRUE"
                masterDB.updateToCart(fromMasterDB: selectedMasterDBObj.codeString, withType: selectedMasterDBObj.typeString)
            }

            //Get book test data from DB - fresh / updated data
             guard let tempArray =  masterDB.retriveMsterData(fromDB: "PROFILE", withGroupName: groupname)  else{return}
//            gaurd let tempArray = self.masterDBObjprofile.retriveMsterData(fromDB: "PROFILE", withGroupName: groupname) else {return}
        strongSelf.profilesArray.removeAll()
        strongSelf.profilesArray = tempArray as! [TCMasterDB]


        strongSelf.getCartValue()
            DispatchQueue.main.async {
                strongSelf.collectionView.reloadData()

            }

        }

        print("end add to cart")
    }

После этого перезагрузите представление коллекции и измените название заголовка кнопки, как удалить / включить, используя значение столбца таблицы.

Это будет повторяться для каждой ячейки, и мое приложение будет аварийно завершать работу и отображать «Сообщение от отладчика: прекращено из-за проблемы с памятью» в журнале Xcode.

Я также использую автозапуск для цикла, но он не работает. Пожалуйста, предложите любое решение для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...