0

我有两个 UILabel,信息和接收。接收应该告诉我我实际上正在接收数据。但是,当它确实表明......我的信息 UILabel 没有相应地更新。它有时有效,有时无效..

那是怎么回事?

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        [super viewDidLoad];

        receiving = [[UILabel alloc] initWithFrame: CGRectMake(30,50,255,100)];
        info = [[UILabel alloc] initWithFrame: CGRectMake(30,200,255,100)];

        info.backgroundColor = [UIColor orangeColor];
        receiving.backgroundColor = [UIColor orangeColor];
//        [self.view addSubview: toggleSwitch];

        receiving.text = @"Not Receiving...";

        [self.view addSubview: info];
        [self.view addSubview: receiving];
    }
    return self;
}

- (void) startCommThread:(id)object
{

//    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // initialize RscMgr on this thread
    // so it schedules delegate callbacks for this thread

    rcsMgr = [[RscMgr alloc] init];
    [rcsMgr setDelegate:self];

    // run the run loop
    [[NSRunLoop currentRunLoop] run];

//    [pool release];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Create and start the comm thread.  We'll use this thread to manage the rscMgr so
    // we don't tie up the UI thread.
    if (commThread == nil)
    {
        commThread = [[NSThread alloc] initWithTarget:self
                                             selector:@selector(startCommThread:)
                                               object:nil];
        [commThread start];  // Actually create the thread
    }
}


- (void) readBytesAvailable:(UInt32)numBytes {

    receiving.text = @"Receiving...";
    NSString* str = [rcsMgr getStringFromBytesAvailable];
    if ( str ) receiving.text = @"I GOT SOMETHING!";
//    if ( numBytes ) receiving.text = numBytes;
    else receiving.text = @"Still Receiving...";
    info.text = str;

}
4

1 回答 1

0

这是我最好的答案,但需要注意的是我从未使用过 RedPark 的电缆或 SDK。我的预感是-readBytesAvailable:RscMgr 在用于设置它的同一后台线程上调用它。您不能在后台线程上使用 UIKit 对象。您需要将工作转移回主线程/队列,如下所示:

- (void)readBytesAvailable:(UInt32)numBytes 
{
    NSString* str = [rcsMgr getStringFromBytesAvailable];
    dispatch_async(dispatch_get_main_queue(), ^{
        if (str) {
            receiving.text = @"I GOT SOMETHING!";
        } else { 
            receiving.text = @"Still Receiving...";
        }
        info.text = str;
    });
}

此外,您的 commThread 上应该有一个自动释放池。你为什么把它评论出来?

于 2013-01-31T21:08:56.180 回答