2015-07-18 11 views
5

में ब्लॉक/बंद करने का उपयोग कैसे करें मेरे ऐप में से एक में मैंने webservice कॉलिंग और प्रतिक्रिया प्राप्त करने के लिए ब्लॉक का उपयोग किया है। अब मैं इस ऐप को तेज़ी से लिखना चाहता हूं, लेकिन मुझे स्विफ्ट में ब्लॉक/क्लोजर का उपयोग करने में परेशानी हो रही है।स्विफ्ट

//

[[Communicator sharedInstance]callWebService:WS_LOGIN withMethod:POST_METHOD andParams:params showLoader:YES completionBlockSuccess:^(id obj) { 
    //Do play with data 
}completionBlockFailiure:^(id obj) { 
    //Show alert with error 
}]; 

// कम्युनिकेटर कक्षा में कम्युनिकेटर के एक वर्ग विधि बुला

-(void)callWebService:(NSString *)serviceName withMethod:(NSString *)methodName andParams:(NSDictionary *)params showLoader:(BOOL)showLoader completionBlockSuccess:(void (^)(id))aBlock completionBlockFailiure:(void (^)(id))aFailBlock 
{ 
    if (showLoader) { 
    // show loader 
    } 
    [self performRequestWithServiceName:serviceName method:methodName andParams:params successblock:aBlock failureblock:aFailBlock]; 
} 

- (void)performRequestWithServiceName:(NSString *)serviceName method:(NSString*)methodName andParams:(NSDictionary*)params 
       successblock:(void (^)(id obj))successBlock 
       failureblock:(void (^)(id obj))failBlock { 
    if(callSuceess){ 
     successBlock(@"Success"); 
    }else{ 
     successBlock(nil); 
    } 
} 

कर सकते हैं किसी भी एक -: यहाँ मेरी उद्देश्य सी कोड है जो मैं तेजी में स्थानांतरित करना चाहते हैं है मेरी मदद करो ?

इस पर किसी भी मदद की सराहना की जाएगी।

अग्रिम धन्यवाद।

उत्तर

3

स्विफ्ट के लिए। आईडी objc प्रकार के लिए AnyObject का उपयोग करें।

func callWebservice (serviceName: String, withMethod method: String, andParams params: NSDictionary, showLoader loader: Bool, completionBlockSuccess aBlock: ((AnyObject) -> Void), andFailureBlock failBlock: ((AnyObject) -> Void)) { 
    if loader { 
     // Show loader 
    } 

    performRequestWithServiceName(serviceName, method: method, andParams: params, success: aBlock, failure: failBlock) 
} 

func performRequestWithServiceName(serviceName: String, method methodName: String, andParams params: NSDictionary, success successBlock: ((AnyObject) -> Void), failure failureBlock: ((AnyObject) -> Void)) { 
    if callSuceess { 
     successBlock("Success") 
    }else { 
     successBlock(nil) 
    } 
} 

अद्यतन: एक उदाहरण है जब आप कॉल web service चाहते हैं। नीचे

callWebservice("your-service-name", withMethod: "your-method", andParams: ["your-dic-key": "your dict value"], showLoader: true/*or false*/, completionBlockSuccess: { (success) -> Void in 
    // your successful handle 
}) { (failure) -> Void in 
    // your failure handle 
} 
+1

ग्रेट +1 पूर्ण उत्तर के लिए –

+1

@ आशीष काक्कड़। धन्यवाद –

+0

@longpham क्या आप कृपया मेरे व्यू कंट्रोलर से callWebservice विधि को कॉल करने में मेरी मदद कर सकते हैं? मुझे स्विफ्ट में बंद होने के साथ पैरामीटर सेट करने में परेशानी हो रही है। अग्रिम में धन्यवाद। –

1

स्विफ्ट Closures के लिए हम) का उपयोग करने (है ->()

उदाहरण के लिए:

func yourFunction(success: (response: AnyObject!) -> Void, failure: (error: NSError?) -> Void) { 

} 

आप इसे कॉल कर सकते हैं के रूप में:

yourFunction({(response) -> Void in 
    // Success 
}) { (error) -> Void in 
    // Handle Errors 
} 

आशा है कि यह करने के लिए आप में मदद मिलेगी अपनी आवश्यकताओं के साथ बंद करें।

+0

मुझे लगता है कि फ़ंक्शन कॉल करने में कुछ वाक्यविन्यास त्रुटि है। –

+0

@MayankJain ओह! अद्यतन उत्तर उम्मीद है कि यह आपके लिए काम करेगा –

2

आपका कोड कोड इस प्रकार दिखाई देंगे देखें:

func callWebService(serviceName: String, method: String, params: [String : AnyObject], showLoader: Bool, success: (responseObject: AnyObject) -> Void, failure: (responseObject: AnyObject) -> Void) { 
    if showLoader { 
     // show loader 
    } 

    performRequest(serviceName, method: method, params: params, success: success, failure: failure) 
} 

func performRequest(serviceName: String, method: String, params: [String : AnyObject], success: (responseObject: AnyObject) -> Void, failure: (responseObject: AnyObject) -> Void) { 

} 

मैं [String : AnyObject] साथ NSDictionary बदल दिया। यदि आप अधिक विशिष्ट प्रकारों के साथ AnyObject के किसी भी उपयोग को प्रतिस्थापित कर सकते हैं, तो आपका कोड क्लीनर और अधिक स्थिर होगा।

1

कम्युनिकेटर कक्षा में विधि कैलोरी कि वेब सेवा वस्तु के प्रकार पर निर्भर करते

func performRequest(serviceName: NSString, methodName: NSString,paramaters:NSDictionary, successblock: (String)->(), failureBlock:() ->()) { 
    if(callSuccess) { 
     successblock("Success") 
    } else { 
     failureBlock() 
} 

वापस जाने के लिए हम उनके कार्य हस्ताक्षर द्वारा के रूप में सफलता और विफलता के ब्लॉक प्रकार को परिभाषित चाहते कुछ इस तरह परिभाषित किया जाएगा उपरोक्त मामले में सफलता को एक विधि के रूप में परिभाषित किया जाता है जो इनपुट पैरामीटर के रूप में एक स्ट्रिंग लेता है और कुछ भी नहीं देता है, इसलिए हम सफलता को कॉल कर सकते हैं। विफलता ब्लॉक को एक ब्लॉक के रूप में ऊपर परिभाषित किया गया है जो कोई पैरामीटर नहीं लेता है और कुछ भी नहीं देता है।

हमें उस इनपुट पैरामीटर (हेरफेर करने के लिए ऊपर के उदाहरण यह होगा में अनुमति देने के लिए इस

Communicator.sharedInstance().callWebService(serviceName: WS_LOGIN , method: POST_METHOD and parameters: params, showLoader: true, completionBlockSuccess:{ returnedString in 

    //Do play with data 

}, completionBlockFailiure:{ 

    //Show alert with error 

}) 

पूरा होने के ब्लॉक के लिए हम एक चर returnedString परिभाषित कॉल करने के लिए इस विधि

func callWebService(serviceName: NSString, method: NSString and parameters: NSDictionary, showLoader: Bool, completionBlockSuccess:(String) ->(), completionBlockFailiure:() ->()) { 
    if (showLoader) { 
    // show loader 
    } 
    performRequest(serviceName: serviceName, methodName: method, parameters, successBlock:completionBlockSuccess, failureBlock: completionBlockFailiure) 
} 

अंत में कॉल करने के लिए स्ट्रिंग "सफलता" हो)।मुझे लगता है कि आपका डेटा सिर्फ स्ट्रिंग को वापस नहीं कर रहा है, इसलिए आपको अपनी सेवा के बदले में टाइप करने के लिए शायद उन्हें चारों ओर खेलने की आवश्यकता होगी। अधिक उपयुक्त हो सकता है:

इसके अलावा यहाँ मैं हालांकि अपनी आवश्यकताओं पर निर्भर करता है स्विफ्ट स्ट्रिंग समकक्ष थे और [AnyObject स्ट्रिंग] NSString और NSDictionary का उपयोग करके अपने विधि हस्ताक्षर से मेल करने की कोशिश की।