ios - 仅在准备好时才返回方法?

标签 ios objective-c methods block

我有一个方法,可以在其中运行几个其他方法。这些具有完成 block ,我只想在每个子方法获得结果后在主方法末尾返回一个值。示例:

-(NSMutableDictionary *)mainMethod
{
    [self subMethod1Complete:^(NSMutableArray *results)
    {

    }

    [self subMethod2Complete:^(NSMutableArray *results)
    {

    }

    //return...
}

我只想在两个子方法完成后返回我的字典。我怎样才能做到这一点?

我确实有为每个方法存储一个 BOOL 的想法,所以我知道,没有不完整,是完整。所以当两者都是"is"时,我返回我的指令。但我怎样才能按时而不是过早地调用它呢?

更新

我已经调整了我的代码以使用完成 block ,因此当我最终从其他方法接收到来自其他两个完成 block 的数据时,我使用编译结果运行最后一个。下面你可以看看我的方法。你可以在下面看到我的方法,到目前为止还没有成功,最终的完成 block 仍然被过早调用。

对我来说很重要。 getTitlesgetThumbnails 方法。在这些的完成 block 中我得到了我需要的数据。只有当我同时拥有这两个时,我才想调用此 main 方法的最终完成 block 。因此,一旦收到标题和缩略图,它将传递它们。

-(void)getFeedForUserID:(NSString *)channelID delegate:(id<YTHelperDelegate>)delegate  complete:(void (^)(NSMutableDictionary * result))completionBlock properties:(NSString *)element, ...
{
    va_list args;
    va_start(args, element);

    NSMutableArray *array = [NSMutableArray new];
    for (NSString *arg = element; arg != nil; arg = va_arg(args, NSString *)) [array addObject:arg];

    va_end(args);

    NSMutableDictionary *resultsDict = [NSMutableDictionary new];

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_group_t group = dispatch_group_create();

    for (NSString *string in array)
    {
        if ([string isEqualToString:kFeedElementTitle])
        {
            dispatch_group_async(group, queue, ^{
                [self getTitlesArrayForChannel:channelID completionHandler:^(NSMutableArray *results) {
                    dispatch_group_async(group, dispatch_get_main_queue(), ^{
                        [resultsDict setObject:results forKey:kFeedElementTitle];
                    });

                }];
            });
        }
        if ([string isEqualToString:kFeedElementTitle])
        {
            dispatch_group_async(group, queue, ^{
                [self getThumbnailsArrayForChannel:channelID completionHandler:^(NSMutableArray *results) {
                    dispatch_group_async(group, dispatch_get_main_queue(), ^{
                        [resultsDict setObject:results forKey:kFeedElementThumbnail];
                    });
                }];
            });
        }
    }

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        completionBlock(resultsDict);
    });
}

最佳答案

您可以使用 GCD 和调度组功能。这是一篇解释它的文章:http://www.objc.io/issue-2/low-level-concurrency-apis.html#groups

例如,在您的情况下,您的代码可能看起来像这样(无耻地从文章中复制并进行了一些修改)...

- (void)asyncMethod {
    dispatch_group_t group = dispatch_group_create();

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_group_async(group, queue, ^(){
        NSMutableArray * results = [self subMethod1];
        dispatch_group_async(group, dispatch_get_main_queue(), ^(){
            self.subMethod1Results = results;
        });
    });
    dispatch_group_async(group, queue, ^(){
        NSMutableArray * results = [self subMethod2];
        dispatch_group_async(group, dispatch_get_main_queue(), ^(){
            self.subMethod2Results = results;
        });
    });

    // This block will run once everything above is done:
    dispatch_group_notify(group, dispatch_get_main_queue(), ^(){
        // notify the app that both sets of data are ready
        [self notifyWorkIsDone];
        // and release the dispatch group
        dispatch_release(group);
    });
}

这需要对类的工作方式进行一些修改,因为上述方法是异步的(这是一件好事 - 在完成所有工作时它不会阻止您的应用程序)。您所需要的只是某种处理程序来调用并通知您的应用您的数据已准备好,您可以更新您的 UI 或执行任何必要的附加处理。

关于ios - 仅在准备好时才返回方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17682469/

相关文章:

javascript - Xcode 中的 UI 自动化

ios - 一侧有阴影/边框和圆角的 iPhone UIButton

python - 为什么具有相同 `id` 的两个函数可以具有不同的属性?

java - Android 代码中扭曲的 Java 方法需要足够的关注

objective-c - 为什么 NSArray 不为不存在的索引返回 NULL?

php - 试图调用方法 : undefined function error

ios - RESTful 服务响应未映射到对象 - RESTKit

ios - 如何在 iPhone 中将 ImageView 的位置设置为 UITableViewCell 的中心

ios - CTRun 在 CoreText iOS 上从右到左

ios - 带有保管箱 URL 错误 : _itemFailedToPlayToEnd: 的 MPMoviePlayerViewController