Я новичок в Свифте. Мое приложение имеет базу данных 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.
Я также использую автозапуск для цикла, но он не работает. Пожалуйста, предложите любое решение для этого.