objective-c - block 在异步线程上执行两次

标签 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 代码,并从整个内容中获取一个 float 供我稍后使用。是的,代码并不完美,仍在学习中。欢迎任何想法。

最佳答案

awakeFromNib 通常不是进行此类操作的好地方。您应该使用 awakeFromNib 来执行您想要在 Interface Builder 中执行的操作,但由于某种原因无法执行 - 所以只是为了解决加载 nib 文件时出现的问题。

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

关于objective-c - block 在异步线程上执行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34133669/

相关文章:

python - 如何使用 Ctrl+C 杀死子线程?

c++ - Qthread : worker for I/O queue

objective-c - 移动后找到文件

macos - 需要 kcachegrind 之类的 mac 分析工具

objective-c - 使按钮暂停并播放声音代码错误

ios - ObjC - 为什么允许实例访问 .m 文件中的类扩展属性?

ios - UITableViewCell 中 UITextLabel 的大小

iphone - 如何在以编程方式创建的 UILabel 上添加 padding-left?

java - JFrame 中的更新方法

xcode - 无法撤销 Mac 证书