Мне сложно понять, как все это сделать. У меня есть приложение для решения головоломок на Mac. Вы входите в головоломку, нажимаете кнопку, и, пытаясь найти количество решений, мин, и поэтому я хотел бы обновить пользовательский интерфейс. Затем, как только закончите вычисление, снова включите кнопку и измените заголовок.
Ниже приведен пример кода с помощью селектора кнопок и решающей функции: (Имейте в виду, что я копирую/вставляю из Xcode, чтобы могли быть некоторые недостающие {} или некоторые другие опечатки.. но это должно дать вам представление о том, что я пытаюсь сделать.
В основном пользователь нажимает кнопку, эта кнопка ВКЛЮЧЕНА = НЕТ, Функция, вызываемая для вычисления головоломки. Пока он вычисляет, обновляйте ярлыки пользовательского интерфейса с данными о перемещениях/решениях. Затем, как только закончите вычислять головоломку, кнопка ENABLED = YES;
Вызывается при нажатии кнопки:
- (void) solvePuzzle:(id)sender{
solveButton.enabled = NO;
solveButton.title = @"Working . . . .";
// I've tried using this as a Background thread, but I can't get the code to waitTilDone before continuing and changing the button state.
[self performSelectorInBackground:@selector(createTreeFromNode:) withObject:rootNode];
// I've tried to use GCD but similar issue and can't get UI updated.
//dispatch_queue_t queue = dispatch_queue_create("com.gamesbychris.createTree", 0);
//dispatch_sync(queue, ^{[self createTreeFromNode:rootNode];});
}
// Need to wait here until createTreeFromNode is finished.
solveButton.enabled=YES;
if (numSolutions == 0) {
solveButton.title = @"Not Solvable";
} else {
solveButton.title = @"Solve Puzzle";
}
}
Нужно работать в фоновом режиме, чтобы пользовательский интерфейс можно было обновить:
-(void)createTreeFromNode:(TreeNode *)node
{
// Tried using GCD
dispatch_queue_t main_queue = dispatch_get_main_queue();
...Create Tree Node and find Children Code...
if (!solutionFound){
// Solution not found yet so check other children by recursion.
[self createTreeFromNode:newChild];
} else {
// Solution found.
numSolutions ++;
if (maxMoves < newChild.numberOfMoves) {
maxMoves = newChild.numberOfMoves;
}
if (minMoves < 1 || minMoves > newChild.numberOfMoves) {
solutionNode = newChild;
minMoves = newChild.numberOfMoves;
// Update UI on main Thread
dispatch_async(main_queue, ^{
minMovesLabel.stringValue = [NSString stringWithFormat:@"%d",minMoves];
numSolutionsLabel.stringValue = [NSString stringWithFormat:@"%d",numSolutions];
maxMovesLabel.stringValue = [NSString stringWithFormat:@"%d",maxMoves];
});
}