0

infoとreceiveingの2つの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 に答える