2013-10-04 3 views
0

Эти два метода у меня есть:Передача переменной другой метод с использованием performSelectorOnMainThread

-(void)session:(MCSession *)session didStartReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID withProgress:(NSProgress *)progress 

{ 
NSLog(@"RECEIVING... %@ from peer: %@", progress, peerID); 
[self performSelectorOnMainThread:@selector(updateUIWithPeerId:) withObject:nil waitUntilDone:YES]; 
} 

- (void) updateUIWithPeerId:(MCPeerID *)peerID { 

UIProgressView *progressBar = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar]; 
progressBar.frame = CGRectMake(0, 200, 100, 20); 
progressBar.progress = 0.5; 
//UIButton* btn = [BluetoothDeviceDictionary objectForKey:peerID]; 
[self.view addSubview:progressBar]; 

UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"Alert View Title" message:@"Alert View Text" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; 
[alertView show]; 
} 

Первый называет второй с этим кодом:

[self performSelectorOnMainThread:@selector(updateUIWithPeerId:) withObject:nil waitUntilDone:YES]; 

Но я хочу, чтобы перейти к второму методу эта переменная: peerID. Обычно я хотел бы сделать:

[self updateUIWithPeerId: peerID]; 

, но я не могу это сделать в performSelectorOnMainThread

ответ

2
[self performSelectorOnMainThread:@selector(updateUIWithPeerId:) 
         withObject:peerID 
        waitUntilDone:YES]; 

От documentation:

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thread withObject:(id)arg waitUntilDone:(BOOL)wait

...

arg
Аргумент для передачи методу при его вызове. Pass nil, если метод не принимает аргумент.


Альтернативно

dispatch_sync(dispatch_get_main_queue(), ^{ 
    [self updateUIWithPeerId:peerID]; 
} 

но быть абсолютно уверены, что не ссылаться на это от основной очереди, так как вызова dispatch_sync на текущей очереди приведет в тупик.

Некоторые идеи о незначительной разнице между этими двумя подходами можно найти здесь: Whats the difference between performSelectorOnMainThread and dispatch_async on main queue?

+0

Спасибо за ваши советы. Должен ли я делать - (void) выполнитьSelector: updateUIWithPeerId onThread: (NSThread *) thread withObject: (id) arg waitUntilDone: (BOOL) wait, если я думаю использовать метод [self performSelectorOnMainThread: @selector (updateUIWithPeerId :) withObject: peerID waitUntilDone: YES]; более одного раза в моем коде? – Alessandro

+0

Извините, я не понимаю вопроса. –

+0

Всякий раз, когда я вызываю код, который вы предоставили мне, это приведет к тому, что метод void - (void) выполнит выбор: (SEL) aSelector onThread: (NSThread *) thread withObject: (id) arg waitUntilDone: (BOOL) wait. Дело в том, что это может быть другой метод, например. вместо updateUIWithPeerId, это может быть updateUIWithPeerId2. Как я могу различать два метода void? – Alessandro

Смежные вопросы