【问题标题】:GCD Prevents Call-back Blocks Being Called?GCD 防止回调块被调用?
【发布时间】:2013-07-15 21:43:36
【问题描述】:

我对 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_asyncblock 中时,回调块永远不会被调用。为什么会这样?

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这与谷歌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

    【讨论】:

    • 啊有趣。我正在使用 YouTube API。可能的解决方案是什么?是否可以运行单独的调度组以避免这种重复错误?当我得到这个错误然后我执行查询时,它的块可能永远不会被调用。
    • 基本上,我想问的是。由于 Google 的 GCD 实现,由于他们使用 GCD 的方式,我不能将它与他们的许多方法结合使用吗?
    • 我认为您可以安全地使用它。问题在于删除对包含相同类/选择器的此方法的重复调用。通过一些调试,您可能会注意到重复调用的位置并将其删除。
    • 嗯,我运气不错。我知道您只能提供这么多帮助而看不到发生了什么,但大概这是 Google 代码中需要修改的问题?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多