我对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方法调用都发生在主线程上。问题消失了。