IOS 7 - 使用委托在后台计算的值更新UILabel

时间:2014-04-14 08:26:41

标签: xcode multithreading uilabel

我在尝试使用委托中的值计算更新UILabel.text时出现问题(这似乎很慢)。

@interface BTAViewController : UIViewController <ExchangeFetcherManagerDelegate>

    @property (weak, nonatomic) IBOutlet UILabel *bidPriceLabel;
    @property (strong, nonatomic) FetcherManager *fetcherManager;

@end

我的BTAViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.fetcherManager = [[FetcherManager alloc]init];
    double calculateValue = [self.fetcherManager fetchPricesFor]; 

    self.bidPriceLabel.contentMode = UIViewContentModeRedraw;
    [self.bidPriceLabel setNeedsDisplay];
    self.bidPriceLabel.text = [[NSString alloc] initWithFormat:@"%f", calculateValue];
 }]; 

标签已在此处未显示的方法中正确初始化,并在启动时显示正确的默认值。一旦我执行此代码,标签将获得值0.00000000,因为我的calculateValue尚未计算。

如何等待计算此值,然后显示标签文本?

我无法发布图片,因为我没有足够的声誉......

由于

2 个答案:

答案 0 :(得分:0)

您确定计算的值不是纯粹的0还是空?

我要做的是在FetchManager的BTAViewController.m中添加委托回调函数

这样的事情:

BTAViewController.h
//add delegate callback function under @interface
-(void)valueReturned:(float)someValue;



BTAViewController.m

-(void)valueReturned:(float)someValue{
//updates value when the delegate returns the value
    self.bidPriceLabel.text = [[NSString alloc] initWithFormat:@"%f", calculateValue];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.fetcherManager = [[FetcherManager alloc]init];
    self.fetchManager.delegate = (id)self;
    [self.fetchManager getPricesFor];

   // double calculateValue = [self.fetcherManager fetchPricesFor]; 

    self.bidPriceLabel.contentMode = UIViewContentModeRedraw;
    [self.bidPriceLabel setNeedsDisplay];
    [self.view addSubview:self.bidPriceLabel];
}]; 

在FetchManager.h和.m

FetcherManager.h

@property (retain,nonatomic)id<ExchangeFetcherManagerDeelgate>delegate;
-(void)getPricesFor;



FetcherManager.m
@synthesize delegate;

-(void)getPricesFor{
    float price;
    //calculate price
    [self.delegate valueReturned:price];
}

答案 1 :(得分:0)

将标签添加到视图中,将其设置为隐藏(bidPriceLabel.hidden = YES)。然后,为委托创建并添加一个方法(BTAViewController),在触发时,检查hidden的{​​{1}}属性,如果它是UILabel(隐藏),则设置 bidPriceLabel.hidden = NO ,然后按预期显示UILabel。

完成检索信息后,在TRUE中调用此方法。