Длительная операция выполняется в основном потоке

Я видел этот вопрос, опубликованный несколько раз, но до сих пор не нашел решения. Я использую синтаксический анализ, размещенный на sdk @ back4app.com.

Получение этой ошибки:

Предупреждение: в основном потоке выполняется длительная операция. Перерыв в warnBlockingOperationOnMainThread() для отладки.

В моем файле home.swift код:

func queryPosts(text:String) {
    showHUD()

    let query = PFQuery(className: POSTS_CLASS_NAME)

    if text != "" {
        let keywords = text.componentsSeparatedByString(" ") as [String]
        query.whereKey(POSTS_QUOTE, containsString: "\(keywords[0])")
    }

    query.orderByDescending("createdAt")
    query.findObjectsInBackgroundWithBlock { (objects: [PFObject]?, error:NSError?)-> Void in
        if error == nil {
            self.postsArray = objects!
            self.postsTableView.reloadData()
            self.hideHUD()

        } else {
            self.simpleAlert("\(error!.localizedDescription)")
            self.hideHUD()
    }}
}

-

Данные загружаются, и приложение не падает, но ошибка сводит меня с ума. Я также понял, что есть небольшая задержка, когда я прокручиваю иногда даже на секунду или две. Если кто-то может помочь, это будет здорово, спасибо.


person OnlyDanWilliams    schedule 01.06.2016    source источник
comment
Вам нужно выполнить загрузку вне основной очереди, а когда это будет сделано, обновить пользовательский интерфейс из основной очереди.   -  person DMH    schedule 01.06.2016
comment
Каков твой вопрос? Хотите знать, как запустить задачу в фоновом потоке?   -  person Feroz    schedule 01.06.2016
comment
@feroz Извините, я недостаточно ясно выразился, мой вопрос действительно заключается в том, чтобы остановить мою ошибку, я читал здесь, чтобы изменить PFObject на AnyObject, и это не сработало, так что да, как я могу запустить его в фоновом потоке? Я могу попробовать это.   -  person OnlyDanWilliams    schedule 01.06.2016
comment
Я подозреваю, что один из ваших методов делегата табличного представления может быть очень, очень, ОЧЕНЬ неэффективным.   -  person gnasher729    schedule 01.06.2016
comment
@DanWilliams Ты решил свою проблему?   -  person Dharmbir Singh    schedule 02.06.2016
comment
@DharmbirSingh Пока ничего нет   -  person OnlyDanWilliams    schedule 02.06.2016


Ответы (1)


В соответствии с нашим обсуждением вы можете изменить свой метод с помощью данных методов:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("PostCell", forIndexPath: indexPath) as! PostCell

    // Resize quote label
    cell.quoteView.frame = CGRectMake(30, 30, view.frame.size.width - 30*2, view.frame.size.width - 30*2)


    let postRecord = postsArray[indexPath.row]

    // Get User Pointer
    let userPointer = postRecord[POSTS_USER_POINTER] as! PFUser

    userPointer.fetchIfNeededInBackgroundWithBlock { (result, error) -> Void in
        cell.avatarImage.image = UIImage(named: "logo")
        let imageFile = userPointer[USER_AVATAR] as? PFFile
        imageFile?.getDataInBackgroundWithBlock({ (imageData, error) -> Void in
            if error == nil {
                if let imageData = imageData {
                    cell.avatarImage.image = UIImage(data:imageData)
                }}})
        cell.avatarImage.layer.cornerRadius = cell.avatarImage.bounds.size.width/2


        cell.usernameLabel.text = "\(userPointer[USER_FULLNAME]!)"


        cell.quoteLabel.text = "\(postRecord[POSTS_QUOTE]!)"
        let quoteColor = postRecord[POSTS_COLOR] as! Int
        cell.backgroundColor = colors[quoteColor]
        cell.quoteView.backgroundColor = colors[quoteColor]
    }


    // Assign tags to buttons in the cell
    cell.likeOutlet.tag = indexPath.row
    cell.reportOutlet.tag = indexPath.row
    cell.shareOutlet.tag = indexPath.row
    cell.avatarOutlet.tag = indexPath.row
    cell.commentOutlet.tag = indexPath.row

    return cell
    }
person Dharmbir Singh    schedule 03.06.2016