Как обновить пользовательский интерфейс с помощью данных Parse вне основного потока (iOS)

Я новичок в Parse и базах данных, и сейчас я в замешательстве.

На виде есть 4 кнопки и метка. Это мой код (извините, он очень грязный):

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

И очевидно, лог выдает ошибку: Warning: A long-running Parse operation is being executed on the main thread. Break on warnParseOperationOnMainThread() to debug.

Я хотел бы использовать запрошенные данные вне блока для обновления label.text, так как же мне установить данные (значение), чтобы я мог использовать их в других методах кода?

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

PFQuery *query = [PFQuery queryWithClassName:@"DataClass"];

[query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {

    if (!error) {
        NSString *getTheStr1 = object[@"A"];
        NSString *getTheStr2 = object[@"B"];
        NSString *getTheStr3 = object[@"C"];
        NSString *getTheStr4 = object[@"D"];

           //when I press a button, each shows a different text on the label.
        UIButton *button = (UIButton *)sender;
        switch ([button tag]) {
            case 1:
                Label.text = [NSString stringWithFormat:@"%@", getTheStr1];
                break;

            case 2:
                Label.text = [NSString stringWithFormat:@"%@", getTheStr2];
                break;

            case 3:
                Label.text = [NSString stringWithFormat:@"%@", getTheStr3];
                break;

            case 4:
                Label.text = [NSString stringWithFormat:@"%@", getTheStr4];
        }
    }
}];

Спасибо.

Я исхожу из моего предыдущего вопроса Как я могу получить несколько данных одновременно? (Синтаксический анализ БД, iOS)


person CloudyLily0009    schedule 07.05.2014    source источник
comment
Модификация пользовательского интерфейса может быть выполнена только в основном потоке. Если вы хотите обновить его, сделайте это в основном потоке.   -  person Larme    schedule 07.05.2014
comment
Вы можете поместить объект в свойство или отправить его как любой другой объект. Если у вас есть свойство PFObject *dataClass, вы можете сделать это в блоке: self.dataClass = object;   -  person Marius Waldal    schedule 07.05.2014
comment
оооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооок Спасибо всем.   -  person CloudyLily0009    schedule 08.05.2014
comment
возможный дубликат Как получить несколько данных одновременно из Parse? (Объект-C)   -  person Fogmeister    schedule 08.05.2014


Ответы (2)


У вас все наоборот: пользовательский интерфейс может обновляться только в основном потоке. Вы должны стараться избегать выполнения всех других длительных операций (таких как сетевые запросы) в основном потоке, чтобы не блокировать его.

Ваш код выглядит нормально, в чем проблема?

person Odrakir    schedule 07.05.2014
comment
Спасибо за ваш ответ! Значит ли это, что я не могу вызывать запрошенные данные другим методом? Я также был бы очень рад, если бы вы могли рассмотреть мой предыдущий вопрос, потому что я совершенно потерялся... - person CloudyLily0009; 07.05.2014
comment
Вы можете отправить полученный объект, не знаю, об этом ли вы спрашиваете. [я мойДругойМетод:объект] - person Odrakir; 07.05.2014
comment
Да, это я и спрашиваю. Спасибо, я понимаю. - person CloudyLily0009; 07.05.2014

Вы пробовали GCD?

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(queue, ^{
        PFQuery *query = [PFQuery queryWithClassName:@"DataClass"];

    [query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {

    if (!error) {
    NSString *getTheStr1 = object[@"A"];
    NSString *getTheStr2 = object[@"B"];
    NSString *getTheStr3 = object[@"C"];
    NSString *getTheStr4 = object[@"D"];

       //when I press a button, each shows a different text on the label.
    UIButton *button = (UIButton *)sender;
    switch ([button tag]) {
        case 1:
            Label.text = [NSString stringWithFormat:@"%@", getTheStr1];
            break;

        case 2:
            Label.text = [NSString stringWithFormat:@"%@", getTheStr2];
            break;

        case 3:
            Label.text = [NSString stringWithFormat:@"%@", getTheStr3];
            break;

        case 4:
            Label.text = [NSString stringWithFormat:@"%@", getTheStr4];
        }
    }
}];
});
person alessioarsuffi    schedule 07.05.2014
comment
Это запустит фоновый поток, который снова запустит фоновый поток (поскольку это делает getFirstObjectInBackgroundWithBlock). Нет необходимости использовать GCD с Parse. - person Marius Waldal; 07.05.2014
comment
Использование getFirstObjectInBackgroundWithBlock гарантирует, что он не использует основной поток. Если он все еще получает это сообщение, то оно из другой части ее кода. - person Marius Waldal; 07.05.2014
comment
Я этого не знал, спасибо за подсказку :) - person alessioarsuffi; 08.05.2014