У меня очень большая проблема. Я использую облачную систему Parse. Когда я получаю изображения с использованием «dispatch_semaphore» из синтаксического анализа, основной поток блокируется. Однако, я думаю, я не использую основной поток при извлечении изображений. Как правило, задача должна выполняться по порядку по разделам A, B, C, затем D, но приложение заблокировано в разделе B.Основной поток заблокирован при выборе изображений из синтаксиса с помощью семафора
Спасибо.
let semaphore1:dispatch_semaphore_t = dispatch_semaphore_create(0)
let semaphore2:dispatch_semaphore_t = dispatch_semaphore_create(0)
let userquery = PFQuery(className: "_User")
userquery.findObjectsInBackground().continueWithSuccessBlock { (task) -> AnyObject? in
let results = task.result as! NSArray
for objectarray in results
{
let object = objectarray as! PFObject
let username = object["username"] as! String
let userpictureThumbnail = object["userPhotoThumbnail"] as! PFFile
userpictureThumbnail.getDataInBackground().continueWithSuccessBlock({ (task2) -> AnyObject? in
let result = task2.result as! NSData
let image = UIImage(data: result)
let imageThumbnail = image
// Section C-) Below codes must be executed but main thread is locked by Section B.
Model.sharedInstance.friendsPictureModel.addItem(username,FriendImageThumbnail:imageThumbnail!)
dispatch_semaphore_signal(semaphore2)
return nil
})
// Section B-) Second, enter the below code . And lock main thread then app freezed.
dispatch_semaphore_wait(semaphore2, DISPATCH_TIME_FOREVER)
}
dispatch_semaphore_signal(semaphore1)
return nil
}
// Section A-) When the block("userquery.findObjectsInBackground().continueWithSuccessBlock") is executed, enter the below code firstly.
dispatch_semaphore_wait(semaphore1, DISPATCH_TIME_FOREVER)
// Section D-) Below codes must be executed in the last.
self.collectionview.reloadData()
Вы вызываете 'dispatch_sempahore_wait' в основной теме? Если да, не следует ли переместить его в фоновый поток, если вы не хотите блокировать основной поток? как и в, переместить всю задачу (создание и ожидание sempahore) на вторичный поток. – ishaq
Есть ли где-то, что рекомендует использовать семафоры? На уровне поверхности я не удивлен, что у вас есть блокировка основного потока, так как это то, что предназначены семафорам. Если вы знаете, что выбор синтаксического анализа происходит в фоновом режиме, вместо этого я бы выполнил свой блок завершения dispatch_async обратно в основной поток, вызывающий 'reloadData()'. –