Как мне работать с асинхронным кодом спагетти? - PullRequest
4 голосов
/ 06 февраля 2010

Я пишу простое приложение, используя Facebook iPhone SDK.Код Facebook в основном асинхронный, я запускаю операцию и получаю ответ асинхронно во время вызова делегата:

- (void) doSomething {
    [FBSomething startOperationWithDelegate:self];
}

- (void) fbOperationFinished: (FBSomething*) operation {…}

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

Это приводит к грязному, своего рода «асинхронному спагетти-коду», потому что код полон условных выражений ипочти невозможно увидеть логику выполнения программы.Есть ли лучший способ написать такой код?(Жаль, что у нас нет блоков на iPhone.) Я думал о введении простого конечного автомата, но я не уверен, что это поможет.

Ответы [ 4 ]

10 голосов
/ 06 февраля 2010

Я не знаком с Facebook SDK, но вы можете просто создать подкласс, который реализует протокол FBRequestDelegate (если он так называется) для каждой конкретной задачи, для которой вам нужен Facebook. Таким образом, вы скажете, что 5 классов реализуют - fbOperationFinished:, а не один класс с 5 различными путями выполнения, разделенными if s или switch es.

3 голосов
/ 06 февраля 2010

Нет необходимости создавать подклассы объектов API Facebook. Я очень рекомендую против этого.

Все объекты facebook имеют поле userInfo, которое можно использовать для хранения конкретной информации запроса. Таким образом, вы можете хранить там что-то, чтобы идентифицировать запрос или даже ссылку на объект для обработки запроса.

Это намного чище и больше в стиле фреймворков Cocoa.

1 голос
/ 06 февраля 2010

(Жаль, что у нас нет блоков на iPhone.)

Вы можете создать визуальный блок, используя фигурные скобки без символа. Например, анимационные блоки не имеют визуальной структуры, но вы можете указать это следующим образом:

// ...some code
[UIView beginAnimations:@"selectionAnimation" context:nil];{
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:0.1];
    [UIView setAnimationRepeatCount:1];
    [UIView setAnimationRepeatAutoreverses:YES];
    { //start properties to animate
        self.transform=CGAffineTransformScale(self.transform, 1.1, 1.1);
    } // end properties to animate
    [UIView commitAnimations];
}
// more code...

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

0 голосов
/ 06 февраля 2010

Я бы поместил эти запросы в NSOperationQueue, это сохраняет каждый из них отличным, а также регулирует, сколько у вас активных одновременно.

Вам просто нужно обернуть запросы в объект NSOperation (который уже может иметь API Facebook?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...