GCD阻止回调块被调用



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

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

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

这更多地与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

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

相关内容

  • 没有找到相关文章

最新更新