0

我对 GCD 很陌生,但我试图只在其他操作完成后调用某些代码。无论如何,这意味着我正在使用您在下面看到的代码:

dispatch_group_async(group, queue, ^{
                [self getTitlesArrayForChannel:channelID completionHandler:^(NSMutableArray *results) {
                        //Nothing in this block called, when method inside dispatch_group
                        [resultsDict setObject:results forKey:kFeedElementTitle];
                        NSLog(@"Received title result");
                }];
            });

所以我正在调用一个带有回调块的方法,给我该方法的结果。当我把它放在dispatch_group_async块内时,回调块永远不会被调用。为什么会这样?

其他值得注意的是,运行此命令时我收到一条控制台消息: Storing duplicate dispatch for GTLQueryYouTube selector setPart:

我不知道它的真正含义,也无法在网上找到任何相关的例子。可能与它有关吗?

基本上,我试图用回调块调用两种不同的方法,给我结果,然后一旦我从两者中得到结果,我想调用最后一个块,给我一个包含每个结果的字典。但是我碰到了这个问题。

4

2 回答 2

1

这与 Google API 有更多关系,错误不是由 GCD 引起的。你可能调用了这个方法:

+ (void)setStoredDispatchForClass:(Class<GTLRuntimeCommon>)dispatchClass
                     selector:(SEL)sel
                  returnClass:(Class)returnClass
               containedClass:(Class)containedClass
                      jsonKey:(NSString *)jsonKey;

此方法存储类和选择器的调度详细信息。如果您通过相同的类和选择器调用此方法两次,则将执行以下代码:

NSDictionary *selDict = (NSDictionary *)CFDictionaryGetValue(classDict, sel);
    if (selDict == nil) {
      selDict = [NSDictionary dictionaryWithObjectsAndKeys:
                 jsonKey, kJSONKey,
                 returnClass, kReturnClassKey, // can be nil (primitive types)
                 containedClass, kContainedClassKey, // may be nil
                 nil];
      CFDictionarySetValue(classDict, sel, selDict);
    } else {
      // we already have a dictionary for this selector on this class, which is
      // surprising
      GTL_DEBUG_LOG(@"Storing duplicate dispatch for %@ selector %@",
            dispatchClass, NSStringFromSelector(sel));
    }
  }

在 else 中,错误被打印出来。您可能会在此处看到代码:

http://google-api-objectivec-client.googlecode.com/svn/trunk/Source/Objects/GTLRuntimeCommon.m

于 2013-07-17T11:34:35.770 回答
0

Google API 似乎不是线程安全的。我遇到了类似的问题,然后我调整了我的代码以确保所有 API 方法调用都发生在主线程上。问题消失了。

于 2014-08-11T00:36:16.100 回答