Лучший способ выполнить выбор на основной поток в объекте c?

Я пишу клиент-серверное приложение для iPhone. И у меня вопрос по поводу многопоточности. Когда я получаю доступ к своей онлайн-базе данных с устройства, мне нужно делать это в отдельном потоке, чтобы не замораживать UI / основной поток. Но, отвечая на данные, которые я получил из базы данных, я вызываю этот метод в основном потоке: performSelectorOnMainThread. Дело в том, что это позволяет мне отправить только один аргумент / объект методу (WithObject), иногда у меня есть больше аргументов, которые я хочу передать. и еще одна вещь в том, что я ДОЛЖЕН передать этот единственный объект. Я не могу передать nil, если приложение вылетает.

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

- (IBAction)testServerAction:(id)sender {

    [self.imageView setHidden:YES];
    [self.activityView setHidden:NO];
    [self.activityView startAnimating];
    dispatch_queue_t testServer = dispatch_queue_create("Test-Server-Thread", NULL);
    dispatch_async(testServer, ^{

        if ([self.arrayWithServerConnections count] > 0)
        {
            NSString *messageToShow;
            if ([self testServerMethod])
            {
                messageToShow = @"Server is working!";
                [self performSelectorOnMainThread:@selector(showMessageBoxWithString:) withObject:messageToShow waitUntilDone:YES];
                [self performSelectorOnMainThread:@selector(threadedUIActivityRemover:) withObject:nil waitUntilDone:YES];
            }else
            {
                messageToShow = @"Server is NOT working!";
                [self performSelectorOnMainThread:@selector(showMessageBoxWithString:) withObject:messageToShow waitUntilDone:YES];
                [self performSelectorOnMainThread:@selector(threadedUIActivityRemover:) withObject:nil waitUntilDone:YES];
            }
        }

    });

    dispatch_release(testServer);
}

-(void)threadedUIActivityRemover:(NSString *)string
{
    [self.imageView setHidden:NO];
    [self.activityView setHidden:YES];
    [self.activityView stopAnimating];
}

Это хороший способ сделать это, есть ли что-нибудь, кроме performSelectorOnMainThread, на которое вы можете указать мне, что работает лучше?

Как вы можете видеть, в этом примере я передаю nil аргументу NSString, потому что Я ДОЛЖЕН передать что-то, если у меня нет NSString в качестве аргумента в методе, приложение вылетает, когда передается nil .. Почему это? .. Пожалуйста, сделайте это немного понятнее для меня!

// Спасибо!

7
задан Objective Coder 29 August 2011 в 16:30
поделиться