ОБНОВЛЕНИЕ: **** небольшое редактирование, я обнаружил, что на самом деле единственное, что зависает, — это получение данных из firebase, особенно изображений, которые необходимо получить. функция initOberserver предназначена для получения данных из firebase. поэтому это нужно делать каждый раз в фоновом режиме. но в то же время табличное представление должно быть пригодным для использования? ****
Я немного борюсь с фоновыми потоками. Я делаю приложение firebase, но мое приложение на некоторое время зависает, когда я загружаю что-то в firebase и возвращаю его обратно в приложение.
У меня есть 2 константы в отдельном открытом файле:
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
У меня есть контроллер просмотра: ListVC, который извлекает данные из firebase с помощью этой функции.
func initObservers() {
//LoadingOverlay.shared.showOverlay(self.view)
dispatch_async(backgroundQueue, {
DataService.ds.REF_LISTS.observeEventType(.Value, withBlock: { snapshot in
print(snapshot.value)
self.lists = []
if let snapshots = snapshot.children.allObjects as? [FDataSnapshot] {
for snap in snapshots {
print("SNAP: \(snap)")
if let listDict = snap.value as? Dictionary<String, AnyObject> {
let key = snap.key
let list = List(listKey: key, dictionary: listDict)
self.lists.insert(list, atIndex:0)
}
}
}
//LoadingOverlay.shared.hideOverlayView()
self.tableView.reloadData()
})
})
}
И затем у меня есть контроллер представления addVC, который отправляет данные в firebase с помощью этой функции:
@IBAction func postListItem(sender: AnyObject) {
if let addTitle = addTitle.text where addTitle != "", let addDescription = addDescription.text where addDescription != "", let addLocation = addLocation.text where addLocation != "" {
dispatch_async(backgroundQueue, {
self.postToFirebase(nil)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let listVC = storyboard.instantiateViewControllerWithIdentifier("TBC") as! UITabBarController
listVC.selectedIndex = 1
self.presentViewController(listVC, animated: false, completion: nil)
})
})
}
}
func postToFirebase(imgUrl: String?) {
LoadingOverlay.shared.showOverlay(self.overlayView)
var post: Dictionary<String, AnyObject> = ["username": currentUsername, "description": addDescription.text!, "title": addTitle.text!, "location": addLocation.text!, "images": self.base64String]
let firebasePost = DataService.ds.REF_LISTS.childByAutoId()
firebasePost.setValue(post)
}
Как видите, я попробовал это с кодом и объяснениями, которые нашел в Интернете, а также в Stack Overflow. Но все же, если я открываю свое приложение и перехожу к listVC, оно зависает через 2 секунды, может быть, на 10 секунд, и когда я что-то публикую, оно также зависает на некоторое время, когда оно переходит в listVC.
У меня также есть этот код:
let uploadImage = image
let imageData = UIImageJPEGRepresentation(uploadImage, 0.5)
self.base64String = imageData!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
без этого кода он не зависает и делает «свое дело» за секунду. но мне нужен этот код для публикации изображений в firebase?