我对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:
我不知道它的真正含义,也无法在网上找到任何相关的例子。它可能与它有关吗?
基本上,我试图用回调块调用两个不同的方法,给我结果,然后一旦我得到两者的结果,我想调用最后一个块给我一个每个结果的字典。但我碰到了这个问题。
答案 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方法调用都发生在主线程上。问题消失了。