2014-08-27 4 views
2

Возможно, мой вопрос будет глуп.AFNetworking и singleton

Я видел много примеров и руководств для приложений, использующих AFNetworking. Многие из них используют создание единого клиента для взаимодействия с сервером REST. Например:

@interface APIClient : AFHTTPClient 

+ (APIClient *)sharedClient; 

@end 

@implementation APIClient 

+ (APIClient *)sharedClient { 
    static APIClient *sharedClient = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedClient = [[APIClient alloc] initWithBaseURL:[NSURL URLWithString:baseUrl]]; 
    }); 

    return sharedClient; 
} 

@end 

Но это безопасно иметь одноплодной для этого? Если мое приложение многопоточно, удобно иметь одноэлемент?


EDIT

В этом tutorial использует класс RestfulClass, который одноэлементно. Он также используется делегатом для уведомления результатов запросов. Используется делегат .. Это не похоже на лучший выбор, если вы используете синглтон, правильно ли это мое мышление?

Предположим, что у нас есть два класса: A и B Оба метода используют один и тот же метод sharedClient. A и B могут устанавливать их как делегат ... это неправильно, потому что один перезаписывает другой ... Все методы не имеют контроля над потокобезопасностью, это правильно?

+0

singleton - это один экземпляр, который может использоваться многими потоками, который выполняется путем обеспечения того, чтобы объект правильно синхронизировался по потокам, как это делали ваши методы. Это абсолютно безопасно в Cocoa, поскольку сетевые запросы выполняются асинхронно и поддерживают параллельные операции. –

+0

I модифицировано мой вопрос. спасибо – Safari

ответ

0

Отправляясь поздно, но я искал информацию о том, как правильно настроить синглтон вокруг AFNetworking. Я нашел этот пост в блоге: singleton-afnetworking

В основном он утверждает, что AFNetworking может обрабатывать одновременные запросы без каких-либо проблем.

0

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

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

Я сейчас рассматриваю это решение, и я думаю, что если бы я сделал один класс веб-сервисов, я бы просто сделал его классом со статическими методами, чтобы сделать запросы (и с помощью параметра block, чтобы вернуть обратный вызов в контроллер), который также не поддерживает состояние. I думаю, что будет более понятным, как его использовать и в идеале поможет избежать путаницы, которую вы указали в своем вопросе.

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