Безопасно ли обращаться к параметрам в объектах, переданных через несколько блоков очереди отправки? - PullRequest
1 голос
/ 08 марта 2012

Допустим, я хочу, чтобы все было хорошо и быстро в основном пользовательском интерфейсе, поэтому я делю медленные части на очереди (используя глобальные параллельные очереди). Предположим, что selectedUser в этом случае остается неизменным.

В одном View Controller у меня есть что-то вроде этого:

- (IBAction)buttonPressed:(id)sender {

    User *selectedUser = [self getSelectedUser];

    dispatch_queue_t queue;
    queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        @autoreleasepool {

            [userManager doSomething:selectedUser withForceOption:YES];

        }

    });

}

А в другом классе я определил синглтон (userManager) с помощью метода, подобного этому:

- (void)doSomething:(User*)user withForceOption:(BOOL)force {

    SAppDelegate *delegate = (SAppDelegate *)[UIApplication sharedApplication].delegate;
    extlib_main_queue = delegate.extlib_main_queue;

    dispatch_async(extlib_main_queue, ^{
        @autoreleasepool {
            extlib_status_t status;
            user.opIsStarting = YES;

            extlib_call_id callId = -1;

            // this is the part that worries me:
            extlib_str_t uri = extlib_str((char *) [[NSString stringWithFormat:@"http:%@@%s", user.account,DOMAIN] UTF8String]);
            status = extlib_call_make_call(0, &uri, 0, NULL, NULL, &callId);
        }

    });
}

У меня вопрос: безопасно ли это делать или мне нужно сделать что-то еще, чтобы убедиться, что параметры переданного экземпляра пользователя остаются доступными для обоих блоков?

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Объект User будет сохраняться обоими блоками, пока они живы.Единственная проблема здесь заключается в том, что объект User должен быть действительно безопасным для доступа из разных потоков.

1 голос
/ 08 марта 2012

Вам не о чем беспокоиться, потому что блоки сохраняют переменные, на которые они ссылаются.

Блок в buttonPressed: сохраняет selectedUser, поскольку блок ссылается на него, а блок в doSomething:withForceOption: сохраняет user, поскольку блок в нем также ссылается на него.

Прочитайте этот раздел из тем программирования блоков для получения более подробной информации о том, как это работает.

...