यह वास्तव में एक अच्छा सवाल है। आपका दृष्टिकोण पूरी तरह से मान्य है। हालाँकि, अलामॉफायर वास्तव में आपको इसे और भी अधिक कारगर बनाने में मदद कर सकता है।
आपका उदाहरण कोड डिस्पैच क्यू ब्रेकडाउन
आप उदाहरण कोड में, आप निम्न प्रेषण कतारों के बीच कूद रहे हैं:
- NSURLSession प्रेषण कतार
- टास्कडेलेगेट सत्यापन और धारावाहिक प्रसंस्करण के लिए कतार भेजते हैं
- अपने पूर्ण हैंडलर को बुलाने के लिए मुख्य प्रेषण कतार
- JSON हैंडलिंग के लिए उच्च प्राथमिकता कतार
- उपयोगकर्ता इंटरफ़ेस को अपडेट करने के लिए मुख्य प्रेषण कतार (यदि आवश्यक हो)
जैसा कि आप देख सकते हैं, आप सभी जगह रुक रहे हैं। आइए एक वैकल्पिक दृष्टिकोण पर एक नज़र डालें, जो आलमोफायर के अंदर एक शक्तिशाली विशेषता का लाभ उठाता है।
अल्मोफायर रिस्पांस डिस्पैच क्यु
Alamofire में एक इष्टतम दृष्टिकोण है जो स्वयं के निम्न स्तर के प्रसंस्करण में बनाया गया है। response
यदि आप इसका उपयोग करना चुनते हैं, तो एक ही विधि, जिसे अंततः सभी कस्टम प्रतिक्रिया क्रमकारों द्वारा बुलाया जाता है, एक कस्टम प्रेषण कतार के लिए समर्थन है।
जबकि जीसीडी प्रेषण कतारों के बीच hopping में अद्भुत है, आप एक कतार में कूदने से बचना चाहते हैं जो व्यस्त है (उदाहरण के लिए मुख्य धागा)। Async प्रसंस्करण के बीच में मुख्य थ्रेड पर वापस कूद को समाप्त करके, आप संभावित रूप से चीजों को काफी गति दे सकते हैं। निम्न उदाहरण दर्शाता है कि यह कैसे करना है अल्मॉफेयर तर्क का उपयोग सीधे आउट-ऑफ-द-बॉक्स।
आलमोफायर 1.x
let queue = dispatch_queue_create("com.cnoon.manager-response-queue", DISPATCH_QUEUE_CONCURRENT)
let request = Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
request.response(
queue: queue,
serializer: Request.JSONResponseSerializer(options: .AllowFragments),
completionHandler: { _, _, JSON, _ in
println("Parsing JSON on thread: \(NSThread.currentThread()) is main thread: \(NSThread.isMainThread())")
println(JSON)
dispatch_async(dispatch_get_main_queue()) {
println("Am I back on the main thread: \(NSThread.isMainThread())")
}
}
)
अलमोफायर 3.x (स्विफ्ट 2.2 और 2.3)
let queue = dispatch_queue_create("com.cnoon.manager-response-queue", DISPATCH_QUEUE_CONCURRENT)
let request = Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
request.response(
queue: queue,
responseSerializer: Request.JSONResponseSerializer(options: .AllowFragments),
completionHandler: { response in
print("Parsing JSON on thread: \(NSThread.currentThread()) is main thread: \(NSThread.isMainThread())")
print(response.result.value)
dispatch_async(dispatch_get_main_queue()) {
print("Am I back on the main thread: \(NSThread.isMainThread())")
}
}
)
अल्मोफायर 4.x (स्विफ्ट 3)
let queue = DispatchQueue(label: "com.cnoon.response-queue", qos: .utility, attributes: [.concurrent])
Alamofire.request("http://httpbin.org/get", parameters: ["foo": "bar"])
.response(
queue: queue,
responseSerializer: DataRequest.jsonResponseSerializer(),
completionHandler: { response in
print("Parsing JSON on thread: \(Thread.current) is main thread: \(Thread.isMainThread)")
print(response.result.value)
DispatchQueue.main.async {
print("Am I back on the main thread: \(Thread.isMainThread)")
}
}
)
अल्मोफायर डिस्पैच क्यू ब्रेकडाउन
यहाँ इस दृष्टिकोण के साथ शामिल विभिन्न प्रेषण कतारों का टूटना है।
- NSURLSession प्रेषण कतार
- टास्कडेलेगेट सत्यापन और धारावाहिक प्रसंस्करण के लिए कतार भेजते हैं
- JSON हैंडलिंग के लिए कस्टम प्रबंधक समवर्ती प्रेषण कतार
- उपयोगकर्ता इंटरफ़ेस को अपडेट करने के लिए मुख्य प्रेषण कतार (यदि आवश्यक हो)
सारांश
मुख्य डिस्पैच कतार में पहले हॉप को समाप्त करके, आपने एक संभावित अड़चन को समाप्त कर दिया है और साथ ही साथ आपने अपने पूरे अनुरोध और प्रसंस्करण को अतुल्यकालिक बना दिया है। बहुत बढ़िया!
इसके साथ ही, मैं यह पर्याप्त तनाव नहीं कर सकता कि अल्मोफायर वास्तव में कैसे काम करता है, के आंतरिक से परिचित होना कितना महत्वपूर्ण है। आप कभी नहीं जानते हैं कि आपको कुछ ऐसा मिल सकता है जो वास्तव में आपको अपना कोड सुधारने में मदद कर सकता है।
response
विधि के लिए दूसरा पैरामीटर अब (अलामोफायर 3.0 में) केresponseSerializer
बजाय कहा जाता हैserializer
। उसCannot call value of non-function type 'NSHTTPURLResponse?'
त्रुटि के कारण मुझे थोड़ी उलझन हुई।