另一个方法里面的方法完成等待

时间:2013-04-24 20:01:26

标签: iphone objective-c objective-c-blocks completion-block

我如何等待某些方法完成然后继续工作?

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

[self.mainTableView reloadData];

...
}

所以我需要等待refreshStream方法完成,然后重新加载tableview数据和loadMoreDataOnBottomOfTableview(...)的其余部分。

5 个答案:

答案 0 :(得分:1)

使用完成块。这就是他们的目的。

请参阅本指南中的完成处理程序部分。 http://developer.apple.com/library/ios/#featuredarticles/Short_Practical_Guide_Blocks/index.html

答案 1 :(得分:1)

重新定义refreshStream

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

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

这应该对你也正确看看这个页面,使用typedef是未说出口的标准。

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

答案 2 :(得分:0)

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

您可以使用此方法调用您的方法。

答案 3 :(得分:0)

我可以在swift中回答您的问题。同样,您可以在代码中使用完成块来完成任务。

class TestClosure
{

func calculateAdditionData() {

    countNumbers({ (result) -> Void in

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


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

    //Your refresh code
    completion()
}

}

完成块/闭包是等待某些事情完成的正确方法。

答案 4 :(得分:-1)

您可以按如下方式使用performSelectorOnMainThread:withObject:waitUntilDone:

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

 [self.mainTableView reloadData];

但请注意,这不是推荐的设计模式。异步调用应该使用回调(您的refreshStream方法应该回调到视图控制器中的方法,然后应该触发reloadData