【发布时间】:2013-01-03 15:45:10
【问题描述】:
所以我有一个准备代码块并安排它在串行调度队列上同步运行的函数。我知道这个串行队列将在一个新线程上运行。然而,问题在于代码块修改了一个变量,该变量将其传递回函数,而函数又期望将其作为返回值返回。下面的代码将有助于澄清情况:
-(DCILocation*) getLocationsByIdentifier: (NSString*) identifier andQualifier: (NSString*) qualifier {
__block DCILocation* retval = nil;
NSString* queryStr = [self baseQueryWithFilterSet:nil];
queryStr = [queryStr stringByAppendingString:@" (identifier = ? OR icao = ?) AND qualifier = ?"];
[self.queue inDatabase:^(FMDatabase *db) {
FMResultSet* results = [db executeQuery:queryStr,
[identifier uppercaseString],
[identifier uppercaseString],
[qualifier uppercaseString]];
if ((nil != results) && [results next]) {
dispatch_async(dispatch_get_main_queue(), ^{
retval = [DCIAirportEnumerator newAirportForStatement:results];
});
[results close];
}
}];
return retval;
}
“self.queue”是块将运行的串行调度队列。请注意,该块修改了“retval”并通过将 dispatch_async 调用嵌套到主线程来更新它。然而,令人担忧的是,在串行调度队列上运行的代码块能够修改它之前,可能会调用“return retval”(函数的最后一行)。这将导致返回“nil”。
关于如何确保函数在 retval 被串行队列上执行的块修改之前不会返回的任何想法?
【问题讨论】:
-
self.queue是什么?由于我们不知道您的队列实现,我们无法帮助您解决序列化问题。 -
您需要异步解决方案来解决同步问题。问问自己,我真的需要调度异步,因为我必须等待它吗?
标签: objective-c thread-safety grand-central-dispatch