NSXMLDocument多个并发操作?

时间:2014-06-29 17:14:00

标签: grand-central-dispatch nsxmldocument

我通过NSXMLDocument在后台进行多个并发XML Document解析,我不认为它是安全的,即使文档声明NSXMLDocument是线程安全的。我随机收到此错误:

Warning: NSBundle NSBundle </System/Library/PrivateFrameworks/XQuery.framework> (loaded) was released too many times. For compatibility, it will not be deallocated, but this may change in the future. Set a breakpoint on __NSBundleOverreleased() to debug

在解析期间文档失败,如果我将GCD队列切换为串行,问题就会消失。有什么我做错了吗?

以下是运行它的代码示例(XML解析发生在ForecastDownloader中):

NSMutableArray *weatherObjects = [[NSMutableArray alloc] init];

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();

dispatch_queue_t serialQueue;
serialQueue = dispatch_queue_create("us.mattshepherd.ForecasterSerialQueue", NULL);

for (NSDictionary *theLocation in self.weatherLocations) {

    // Add a task to the group
    dispatch_group_async(group, queue, ^{
        NSLog(@"dispatching...");
        ForecastDownloader *forecastDownloader = [[ForecastDownloader alloc] init];
        int i = 0;
        WeatherObject *weatherObject = [forecastDownloader getForecast:[theLocation objectForKey:@"lat"] lng:[theLocation objectForKey:@"lng"] weatherID:[[theLocation objectForKey:@"id"] intValue]];

        }
        if(!weatherObject){
            //need to implement delegate method to show problem updating weather
            NSLog(@"problem updating weather data");
        }else{
            NSLog(@"got weather for location...");
            dispatch_sync(serialQueue, ^{
                [weatherObjects addObject:weatherObject];
            });


        }
    });

}
// wait on the group to block the current thread.
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

NSLog(@"finished getting weather for all locations...");
//we will now do something with the weatherObjects

0 个答案:

没有答案