Метод внутри ожидания завершения другого метода

Как я могу дождаться завершения какого-то метода, а затем продолжить работу??

- (void)loadMoreDataOnBottomOfTableview
{
NSLog(@"LOADING ITEMS ON BOTTOM");
[self refreshStream];

[self.mainTableView reloadData];

...
}

Поэтому мне нужно дождаться завершения метода refreshStream, а затем перезагрузить данные таблицы и остальную часть loadMoreDataOnBottomOfTableview (...).


person zhuber    schedule 24.04.2013    source источник
comment
Вы нашли решение?   -  person Ben Coffman    schedule 26.04.2013


Ответы (5)


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

См. раздел обработчика завершения в этом руководстве. http://developer.apple.com/library/ios/#featuredarticles/Short_Practical_Guide_Blocks/index.html

person Victor Engel    schedule 24.04.2013

Переопределить refreshStream

 -(void)refreshStream:(void (^)(void))complete;

 -(void)loadMoreDataOnBottomOfTableview
 {
     [self refreshStream:^{
           [self.mainTableView reloadData];
     }];
 }

Это должно сделать вас правильно, также проверьте эту страницу, использование typedef является негласным стандартом.

http://developer.apple.com/library/mac/#featuredarticles/BlocksGCD/_index.html

person Ben Coffman    schedule 24.04.2013

[self performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>];

Вы можете вызвать свой метод, используя this.

person Himanshu    schedule 25.04.2013

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

class TestClosure
{

func calculateAdditionData() {

    countNumbers({ (result) -> Void in

        println("[self refreshStream] completed")
        //[self.mainTableView reloadData];
    })
}


func refreshStream(completion: (() -> Void)!) {

    //Your refresh code
    completion()
}

}

Блоки завершения/замыкания — это правильный способ дождаться завершения чего-либо.

person cheeseRoot    schedule 03.06.2015

Вы можете использовать performSelectorOnMainThread:withObject:waitUntilDone: следующим образом:

 [self performSelectorOnMainThread:@selector(refreshStream) withObject:nil waitUntilDone:YES]

 [self.mainTableView reloadData];

Обратите внимание, однако, что это НЕ рекомендуемый шаблон проектирования. Асинхронные вызовы должны использовать обратные вызовы (ваш метод refreshStream должен вызывать метод в вашем контроллере представления, который затем должен запускать reloadData

person Jai Govindani    schedule 24.04.2013