Я использовал this руководство, чтобы использовать мое приложение NSOperationQueue и NSOperations. Но мой код по-прежнему работает на основном потоке независимо: S? Я должен сказать, что я новичок в NSOperation, я думаю, что это небольшая вещь, которую я пропустил.NSOperation running on main thread
class CountryFetcher: NSObject{
var operation: NSOperation?
var alamoFireQueue: NSOperationQueue{
let val = NSOperationQueue()
val.maxConcurrentOperationCount = 10
val.name = "Alamofire Downloading Queue"
return val
}
func getCountries(){
operation = CountryProcessor(URLString: (BASE_URL + "countries/"+CAT_STAMPS))
alamoFireQueue.addOperation(operation!)
}
}
class CountryProcessor : ConcurrentOperation {
let URLString: String
weak var request: Alamofire.Request?
init(URLString: String) {
self.URLString = URLString
super.init()
}
override func main() {
request = Alamofire.request(.GET, URLString).responseJSON { response in
if let dataResponse = response.data{
var test: NSArray?
do{
test = try NSJSONSerialization.JSONObjectWithData(dataResponse, options: NSJSONReadingOptions()) as! NSArray
}catch let error as NSError{
print(error.localizedDescription)
}
for _ in 1...100{
NSLog("main thread? %@", NSThread.isMainThread() ? "YES" : "NO");
}
}
self.completeOperation()
}
}
override func cancel() {
request?.cancel()
super.cancel()
}
}
Это класс ConcurrentOperation. Я скопировал его с поста в ссылке выше.
class ConcurrentOperation : NSOperation {
override var asynchronous: Bool {
return true
}
override var concurrent: Bool{
return true
}
private var _executing: Bool = false
override var executing: Bool {
get {
return _executing
}
set {
if (_executing != newValue) {
self.willChangeValueForKey("isExecuting")
_executing = newValue
self.didChangeValueForKey("isExecuting")
}
}
}
private var _finished: Bool = false;
override var finished: Bool {
get {
return _finished
}
set {
if (_finished != newValue) {
self.willChangeValueForKey("isFinished")
_finished = newValue
self.didChangeValueForKey("isFinished")
}
}
}
/// Complete the operation
///
/// This will result in the appropriate KVN of isFinished and isExecuting
func completeOperation() {
executing = false
finished = true
}
override func start() {
if (cancelled) {
finished = true
return
}
executing = true
main()
}
}
Когда я выполняю этот код, он продолжает говорить, что он работает в основном потоке: 2016-08-12 18: 25: 45,799 Stamp Catalague Preloader [1807: 31357] Основная нить? ДА.
Как это происходит? Спасибо за вашу помощь;
Возможно, вы получили подкласс 'NSOperation' из [здесь] (http://stackoverflow.com/questions/27021896/nsurlsession-concurrent-requests-with-alamofire/27022598#27022598), но я его обновил синхронизировать «исполняемые» и «готовые» геттеры и сеттеры. См. Раздел [Многоуровневые соображения] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSOperation_class/index.html#//apple_ref/doc/uid/TP40004591-RH2-SW17), в котором обсуждается о важности их синхронизации. – Rob
Кроме того, поскольку вы используете 'responseJSON', нет необходимости вызывать' NSJSONSerialization'. Это уже сделано для вас. (Вот почему мы используем 'responseJSON', поэтому нам не нужно беспокоиться о его синтаксическом анализе.) Просто используйте' response.result.value'. – Rob