Block在异步线程上执行两次

时间:2015-12-07 12:33:44

标签: objective-c multithreading macos cocoa

我有一个奇怪的问题。我有一个类在后台线程上调用另一个类中的方法,但它在线程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代码,并从整个内容中获取一个浮点数,供我稍后使用。你的代码不完美,还在学习。欢迎任何想法。

3 个答案:

答案 0 :(得分:1)

awakeFromNib通常不适合这种事情。你应该使用awakeFromNib做你想在Interface Builder中做的事情,但由于某种原因不能 - 所以只是为了解决加载nib文件时出现的问题。

例如,如果在不同的上下文中使用相同的类,并且在代码中构建用户界面而不是使用nib文件,那么在awakeFromNib中执行操作会让您遇到麻烦,并且您的awakeFromNib不会被调用再一次。

答案 1 :(得分:0)

检查您的应用中是否两次调用awakeFromNib ...(see this question

答案 2 :(得分:0)

你们都是对的。哇,真是个愚蠢的错误。事实上,另一个类也在调用awakeFromNib来做它的东西。

我将这些调用放在viewDidLoad方法中,它现在正在运行!大!学习这种多线程的东西是多么好的方法! :)