我有一个奇怪的问题。我有一个类,它在后台线程上调用另一个类中的方法,但它在线程 2 上获取数据两次,然后一旦完成,就将其放入线程 4 中。有谁知道为什么吗?
调用该方法的类:
-(void)awakeFromNib
{
NSString *swedbankRate;
CurrencyViewHelper *currencyRates = [[CurrencyViewHelper alloc]init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
swedbankRate = [currencyRates getSwedbankRates];
NSLog(@"%@", swedbankRate);
});
所以来自CurrencyViewHelper的部分是:
-(NSString *)getSwedbankRates {
// Set to empty String in case there is some issue
swedbankRate = @"";
// Get Data from Swedbank
NSString *swedbankURL = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://www.swedbank.ee/private/d2d/payments2/rates/currency?language=EST"]
encoding:NSASCIIStringEncoding
error:nil];
NSArray *swedbankArray = [swedbankURL componentsSeparatedByString:@"<tr>"];
NSString *swedbankString = swedbankArray[18];
swedbankArray = [swedbankString componentsSeparatedByString:@"<tr>"];
NSString *swedbankDirty = swedbankArray[0];
// Check if the fetched data corresponds to RUB data
if ([swedbankDirty containsString:@"RUB"]) {
swedbankDirty = [swedbankDirty stringByReplacingOccurrencesOfString:@"<td class=\"numeric-cell\">"
withString:@""];
swedbankDirty = [swedbankDirty stringByReplacingOccurrencesOfString:@"\n"
withString:@""];
swedbankDirty = [swedbankDirty stringByReplacingOccurrencesOfString:@" "
withString:@""];
NSArray *swedbankCleanArray = [swedbankDirty componentsSeparatedByString:@"</td>"];
swedbankDirty = swedbankCleanArray[4];
// Set result to value fetched from internet
swedbankRate = [NSString stringWithFormat:@"%.2f", [swedbankDirty floatValue]];
}
结果是
2015-12-07 14:26:29.635 Photography[60338:18355297] 71.14
2015-12-07 14:26:29.684 Photography[60338:18355293] 71.14
我无法确定它为什么会被执行两次?
该方法的作用是扫描网页的 HTML 代码,并从整个内容中获取一个 float 供我稍后使用。是的,代码并不完美,仍在学习中。欢迎任何想法。
最佳答案
awakeFromNib 通常不是进行此类操作的好地方。您应该使用 awakeFromNib 来执行您想要在 Interface Builder 中执行的操作,但由于某种原因无法执行 - 所以只是为了解决加载 nib 文件时出现的问题。
例如,如果您在不同的上下文中使用相同的类,并且如果您在代码中而不是使用 nib 文件构建用户界面,并且您的 awakeFromNib 不会被调用,那么在 awakeFromNib 中执行操作会给您带来麻烦一切都不再了。
关于objective-c - block 在异步线程上执行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34133669/