Какао / Цель C: методы и безопасность потоков - PullRequest
1 голос
/ 26 августа 2011

В Какао / Objective C, методы статического класса потокобезопасны?Я определяю класс для создания связанных пользовательских URL-запросов, которые я хотел бы вызывать из разных потоков.Допустим, у меня есть класс:

@interface URLConnector : NSObject {
}
+(Response *)getData:(NSString *)category;
+(Response *)put:(NSString *)category content:(NSData *)content;
@end

Каждый метод определяет NSMutableURLRequest, вызывает его и использует NSRunLoop: runUntilDate: для ожидания ответа.Они также создают экземпляры другого класса, URLConnectorDelegate для обработки обратных вызовов из NSMutableRequests и освобождают их перед возвратом.(примечание: этот код основан на популярной публичной библиотеке для выполнения запросов URL)

Что мне нравится в этом подходе, так это то, что он упрощает все потоки и помещает весь пользовательский код, связанный с сервером, в одно место.Потоки могут выполнять URL-запросы одним вызовом функции.

Могут ли все мои потоки использовать эти статические функции одновременно для одновременных вызовов (т. Е. Являются ли статические методы target-c по своей природе поточно-ориентированными)?

Ответы [ 4 ]

3 голосов
/ 26 августа 2011

Быть классным методом так или иначе не влияет на безопасность потока. Важно то, как вы получаете доступ к данным. Если вы обращаетесь к данным способами, которые не являются поточно-ориентированными, метод не является поточно-ориентированным.

Вместо того, чтобы качать свой собственный цикл выполнения, я бы просто прикрепил NSURLConnection к основному циклу выполнения, и система загрузки URL-адресов управляет собой так, как она предназначена. Смотри NSURLConnection scheduleInRunLoop:forMode:

2 голосов
/ 26 августа 2011

Если вы знаете, что будете в фоновом потоке, почему бы просто не использовать +[NSURLConnection sendSynchronousRequest:returningResponse:error:] и покончить с этим?

Нет необходимости в фазе с циклом выполнения.И если вы используете только локальные переменные и аргументы, вы получаете безопасность потоков практически без всякой работы.

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

Методы класса ненемного более потокобезопасен, чем методы экземпляра.Оба вида методов фактически одинаковы во время выполнения.На самом деле класс является экземпляром объекта своего метакласса, поэтому вызов метода класса - это обычный вызов метода объекта.

0 голосов
/ 26 августа 2011

Предполагая, что вы вызываете NSRunLoop:runUntilDate: для цикла выполнения текущего потока (т. Е. Независимо от того, какой поток вызывает ваш метод класса), если в этих методах класса не модифицируется глобальная / статическая переменная, я считаю, что они должны быть безопасными для потока.

0 голосов
/ 26 августа 2011

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

...