Проблема многопоточности в приложении iPhone? - PullRequest
1 голос
/ 07 марта 2012

У меня проблема с приложением.Мое приложение я попытался прочитать некоторые данные из сокета асинхронно и обрабатывать его синхронно.

Вот ситуация

У меня запущен поток (скажем, Поток A) для приема данных из сокета.Я должен обработать эти данные в другом потоке, потому что я не хочу блокировать этот поток A.

@implementation SocketListener

//Running on Thread A
//Socket data receiving delegate
- (BOOL)onMessage:(NSString *)aMessage response:(NSMutableString *)aResponse {

    //Newly created thread
    [NSThread detachNewThreadSelector:@selector(addMessage:)    
                         toTarget:[DataProcessor sharedInstance] 
                       withObject:aMessage];

}

@end


@implementation DataProcessor
//Newly created thread say Thread X
- (void) addMessage:(NSString *)aMessage {

//Add message to queue
[[DataStore sharedInstance] pushData:aMessage];

//Want to call in another single thread (Don't wanna run on Thread X)
//Start DataExecutor
[[DataExecutor sharedInstance] startExecution];

}

@end

@implementation DataExecutor


//startExecution
- (void) startExecution {

id data = [[DataStore sharedInstance] popData];
//processing data 
//save it to database and send it to server via HTTP
}

@end


@implementation DataStore


//pushData
- (void) pushData:(id)data {

//synchronized
//pushing data to store 

}


//popData
- (id) popData {

//synchronized
//poping data and return

}

@end

Здесь, в классе SocketListener, я получу данные asynchronously и передам их DataProcessor для обработки.Класс DataProcessor сохранит данные в DataStore для последующей обработки, если класс DataExecutor занят обработкой других данных.Но моя проблема в том, что я хочу создать один поток в DataExecutor для обработки.Таким образом, startExecution будет выполняться в одном потоке, а добавление данных будет выполняться во вновь созданном потоке.Кто-нибудь может сказать мне несколько предложений по этому вопросу.Если вам нужно больше объяснений, пожалуйста, дайте мне знать.Заранее спасибо.

С уважением, пользовательX

Ответы [ 2 ]

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

Это то, для чего предназначена NSOperationQueue.Используйте это.

0 голосов
/ 07 марта 2012

Если вы хотите добиться эффекта, заключающегося в том, что исполнитель обрабатывает данные последовательно, вы можете запустить таймер в классе DataExecutor, который периодически проверяет очередь на данные для обработки и всегда добавлять данные в очередь из вашего класса SocketListener.

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