«элемент initializer не является константой времени компиляции» при создании очереди GCD - PullRequest
1 голос
/ 22 декабря 2011

МОЙ ПЛОХОЙ, Я НАСТОЯЩИМ НАПИСАЛ ЭТОТ КОД ВНЕ РЕШЕНИЯ, ЧТО БОЛЬШАЯ НАИВНАЯ ОШИБКА

Я изучаю очереди GCD и создаю блоки для работы в фоновом режиме,

-(IBAction) refresh:(id) sender
{
    dispatch_queue_t downloadQueue = dispatch_queue_create("app data", NULL);
    dispatch_async(downloadQueue, ^{
        //. . . Call a method which download XML file from server . . .
        dispatch_async(dispatch_get_main_queue(), ^{
        //. . . Update UI with dowanloaded data . . .    
        });
    });
    dispatch_release(downloadQueue);
}

но эта строка кода показывает ошибку компиляции

dispatch_queue_t downloadQueue = dispatch_queue_create("eiap data", NULL);

ОШИБКА : элемент инициализатора не является константой времени компиляции

<Ч />

Я могу сказать, что что-то не так с «данными приложения» const char, который я создаю на лету, но я не знаю, что с ним не так?

Спасибо

Ответы [ 3 ]

4 голосов
/ 22 декабря 2011

Если я сделаю это, он скомпилирует:

dispatch_queue_t downloadQueue = dispatch_queue_create("app data", NULL);

, но если я сделаю это, я получу именно ту ошибку, которую вы упомянули:

static dispatch_queue_t downloadQueue = dispatch_queue_create("app data", NULL);

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

2 голосов
/ 22 декабря 2011

Избавьтесь от пробелов в строке инициализатора.

Используйте что-то вроде:

dispatch_queue_t downloadQueue = dispatch_queue_create("com.eiap.dataTask", NULL);

Apple рекомендует использовать строки в стиле обратной нотации DNS.

Вот учебник, на который вы можете сослаться, b.t.w. Надеюсь, мой ответ вам поможет!

1 голос
/ 22 декабря 2011

Попробуйте использовать dispatch_queue_t downloadQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

Вот моя реализация того, что вы описываете:

UIAlertView *av =[[UIAlertView alloc] initWithTitle:@"Loading Data" message:@"" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
UIActivityIndicatorView *ActInd=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

[ActInd startAnimating];
[ActInd setFrame:CGRectMake(125, 60, 37, 37)];
[av addSubview:ActInd];
[av show];

dispatch_queue_t callerQueue = dispatch_get_main_queue();
//dispatch_retain(callerQueue);
dispatch_queue_t downloadQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                                       0);

dispatch_async(downloadQueue, ^{
    [self doLoadData];
    dispatch_async(callerQueue, ^{
        [av dismissWithClickedButtonIndex:0 animated:YES];
        [av release];
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
    });
    dispatch_release(downloadQueue);
});
...