2012-03-16 3 views
1

У меня есть вызов, который идет на сервер. Я хочу, чтобы обратный вызов здесь выполнялся асинхронно во вторичном потоке, который не является потоком пользовательского интерфейса. Core Data здесь зависает, и я хотел бы попытаться сделать приложение более отзывчивым. Каков наилучший способ запустить этот обратный вызов во вторичном потоке? Пример кода был бы замечательным!Запуск блока какао во вторичной теме

[[SomeServer sharedInstance] doServerCallCallback:^(NSObject *param) { 

    NSManagedObjectContext *moc = [MYAPPDELEGATE managedObjectContext]; 

    /* do more stuff with param */ 

    [MYAPPDELEGATE saveManagedObjectContext]; 
}]; 

Сам вызов сервер не должен быть во вторичном потоке, однако код выполняется в блоке должно быть.

ответ

1

Положить некоторые работы на фоновый поток легко: скройте свой блок dispatch_async(), -[NSOperationQueue addOperationWithBlock:] или, возможно, даже что-то связанное с подключением к серверу, которое вы используете, например +[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]. (Посмотрите на любой из них в документах для примеров использования.)

Если вы хотите сделать материал Core Data в своем фоновом потоке, это становится неприятным, если вы не используете iOS 5.0 или новее. У Apple есть большая запись на Concurrency and Core Data для случая до 5.0, но новый материал, в то время как намного проще для простых применений, как вы предлагаете, не так хорошо документирован. This question должно дать вам хорошее начало.

0

Блок, который вы передаете, является объектом, который сервер выполнит в какой-то момент. Если вы хотите, чтобы блок выполнялся в другом потоке, вам нужно будет изменить реализацию SomeServer -doServerCallCallback:.

Подробную информацию об использовании блоков см. В руководстве пользователя Grand Central Dispatch Reference. Короче говоря, сервер должен создать очередь отправки при запуске. Затем вы можете использовать функцию, например dispatch_async(), для выполнения блока.

+0

Не нужно изменять реализацию SomeServer. Блок, который вы передаете ему, может отправить работу в очередь с потоком. –

+0

@GrahamLee Это зависит от того, хочет ли OP один блок или любой блок, который может быть передан серверу для запуска в другом потоке. Ваш подход прекрасен, но только в первом случае; изменение сервера позаботится об этом для всех случаев. – Caleb

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