我有一个奇怪的问题。我有一个类在后台线程上调用另一个类中的方法,但它在线程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代码,并从整个内容中获取一个浮点数,供我稍后使用。你的代码不完美,还在学习。欢迎任何想法。
答案 0 :(得分:1)
awakeFromNib通常不适合这种事情。你应该使用awakeFromNib做你想在Interface Builder中做的事情,但由于某种原因不能 - 所以只是为了解决加载nib文件时出现的问题。
例如,如果在不同的上下文中使用相同的类,并且在代码中构建用户界面而不是使用nib文件,那么在awakeFromNib中执行操作会让您遇到麻烦,并且您的awakeFromNib不会被调用再一次。
答案 1 :(得分:0)
检查您的应用中是否两次调用awakeFromNib
...(see this question)
答案 2 :(得分:0)
你们都是对的。哇,真是个愚蠢的错误。事实上,另一个类也在调用awakeFromNib来做它的东西。
我将这些调用放在viewDidLoad方法中,它现在正在运行!大!学习这种多线程的东西是多么好的方法! :)