【问题标题】:How to determine when all methods are finished?如何确定所有方法何时完成?
【发布时间】:2013-05-18 13:59:09
【问题描述】:

我有 RootViewController,我在其中创建 MainViewDownload 实例并调用该实例的方法。

MainViewDownload *download = [[MainViewDownload alloc] init];
[download loadMainViewImages];

我如何知道 loadMainViewImages 何时完成?我只从 RootViewController 调用 loadMainViewImages,但 loadMainViewImages 调用 MainViewDownload 类中的另一个方法(比如说 method2),并且该 method2 再次调用 method3。那么,有没有办法知道 loadMainViewImages 何时完成(实际上是 method3 自上次调用以来何时完成)。

【问题讨论】:

    标签: objective-c methods method-call


    【解决方案1】:

    如果您不是多线程,即启动一个在与loadMainViewImages 不同的线程上运行的方法,那么这些方法将按顺序执行。因此,一旦loadMainViewImages 返回,您就可以确定“其中”的所有内容都已执行。这就是方法的工作原理。

    编辑以获得更好的 cmets 格式:

    MainViewDownload.h

    @protocol MainViewDownloadDelegate;
    
    @interface MainViewDownload
    @property (nonatomic, weak) NSObject<MainViewDownloadDelegate> *delegate;
    @end
    
    @protocol MainViewDownloadDelegate
    - (void)downloadDidFinish:(MainViewDownload *)download;
    @end
    

    MainViewDownload.m

    @implementation MainViewDownload
    
    - (void)someMethodThatDownloadsStuff_OrIsCalledAfterTheDownload {
        ...
        if ([self.delegate respondsToSelector:@selector(downloadDidFinish:)]) {
            [self.delegate downloadDidFinish:self];
        }
    }
    
    @end
    

    RootViewController.h

    @interface RootViewController <MainViewDownloadDelegate>
    ...
    @end
    

    RootViewController.m

    @implementation
    ...
    - (void)downloadDidFinish:(MainViewDownload *)download {
        // hide the download view here.
    }
    @end
    

    确保将下载视图的委托设置为根视图控制器。

    【讨论】:

    • 有没有办法在 loadMainViewImages 完成之前阻止?
    • 什么意思?只需在其末尾添加一些内容即可。但这与将代码放在根视图控制器中的loadMainViewImages 之后是一样的。
    • 所以,我需要 [下载 loadMainViewImages] 并在加载完成后,例如删除 LoadingView 屏幕。但是,如果我只是在下面添加该行,它将不会等待 loadMainViewImages 完成
    • 这正是您可能要考虑使用委托的情况。向您的MainViewDownload 添加一个名为MainViewDownloadDelegate 或类似的协议。给它添加一个方法- (void)downloadFinished:(MainViewDownload *)download;。向实现此协议的 MainViewDownload 添加弱委托属性:@property (nonatomic, weak) NSObject&lt;MainViewDownloadDelegate&gt; *delegate;。扩展RootViewController 来实现协议。 @interface RootViewController &lt;MainViewDownladDelegate&gt; 并实现 RootViewController 中的方法来执行您想要下载的操作。
    • 现在您只需在下载完成后将该消息发送给您的代理:if ([self.delegate respondsToSelector:@selector(downloadFinished:)]) [self.delegate downloadFinished:self];
    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2021-02-18
    • 1970-01-01
    相关资源
    最近更新 更多