gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:12:43 25 4
gpt4 key购买 nike

我有一个方法可以运行其他几个方法。这些有完成 block ,一旦我从每个子方法中得到结果,我只想在我的主要方法结束时返回一个值。示例:

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

}

[self subMethod2Complete:^(NSMutableArray *results)
{

}

//return...
}

一旦两个子方法完成,我只想在最后返回我的字典。我该怎么做?

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

更新

我已经调整我的代码以使用完成 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com