GCD防止被叫回叫块?

时间:2013-07-17 11:02:20

标签: objective-c youtube-api block grand-central-dispatch

我对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:

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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