2012-10-30 10 views
6

मैं MKNetworkKit पर नया हूं, लेकिन मैं इसे अपने प्रोजेक्ट में जोड़ सकता हूं और पहुंचने योग्य परिवर्तनों से निपटने के अलावा यह पूरी तरह से काम कर रहा है।एमकेनेटवर्ककिट ऑपरेशन तब तक शुरू नहीं होता है जब पहुंच क्षमता बदलती है

  1. मैं वाईफ़ाई अक्षम करें और अनुप्रयोग चलाने:

    यहाँ स्थिति है।

  2. पहुंच के बिना भी, मैं अपने MKNetworkEngine सबक्लास से MKNetworkOperation बनाकर कुछ डेटा (POST का उपयोग करके) अनुरोध करता हूं। डेटा का अनुरोध करने से ठीक पहले, ऑपरेशन को फ्रीजबल के रूप में सेट किया गया है (Mugunth Kumar's doc के अनुसार)।
  3. वाईफाई सक्षम करने के बाद, checkAndRestoreFrozenOperationsMKNetworkEngine में कहा जाता है और यह पता लगाता है कि एक लंबित ऑपरेशन (पहुंच के बिना बनाया गया कोई भी) है, जो एनक्यू करने की कोशिश करता है।
  4. उसके बाद, मेरे onCompletion ब्लॉक को कभी नहीं कहा जाता है।

क्या कुछ भी है जो मुझे फ्रीजिंग ऑपरेशंस के बारे में समझ में नहीं आता है + MKNetworkKit में पहुंच योग्यता? क्या फ्रीज केवल उन परिचालनों के लिए काम करता है जहां अनुरोध शुरू होने के बाद पहुंच में परिवर्तन होता है? या मुझे अपनी खुद की पहुंच क्षमता को लागू करना चाहिए ब्लॉक?

यहां मेरे MKNetworkEngine उपclass में कोड है जो ऑपरेशन बनाता है और अनुरोध शुरू करता है। ध्यान दें कि अप्रासंगिक कोड दबा दिया गया है। पूरा फिर से शुरू बनाम:

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObject:@"value" forKey:@"param"]; 
MKNetworkOperation *op = [self operationWithPath:MYPATH 
              params:params 
             httpMethod:@"POST"]; 
[op setFreezable:YES]; 

[op onCompletion:^(MKNetworkOperation *completedOperation) { 
    // ... 
    // Here is where I process response and send the result to my completion block 
    // It's called when WiFi is available, but not called otherwise. 
    // ... 
} onError:^(NSError *error) { 
    // It's called when WiFi is available, but not called otherwise. 
    DLog(@"Some error"); 
}]; 

[self enqueueOperation:op]; 

return op; 
+0

आप में एक मेजबान में सेट किया था इंजन? यदि आप देखते हैं कि कैसे जमे हुए संचालन का सामना किया जाता है, तो वे तब तक काम नहीं करते जब तक कि इंजन के लिए एक होस्ट परिभाषित न हो। –

+0

@ केनव्यू हां। मेरे इंजन उपclass में init विधि '[सुपर initWithHostName: ] 'कहते हैं। – msoler

+0

@msoler क्या आप इसे काम करने के लिए मिला? मुझे एक ही समस्या है – alandalusi

उत्तर

6

ये दो अलग-अलग समस्याएं हैं।

  1. फिर से शुरू: फ्रीज/अनफ़्रीज़ तंत्र तभी काम करता है कैश

    आप अपने AppDelegate -didFinishLaunchingWithOptions में -useCache आह्वान चाहिए सक्षम है:

    self.networkEngine = [[MKNetworkEngine alloc] init ...]; 
    [self.networkEngine useCache]; // <- Add this line 
    
  2. पूरा: पूरा होने का कॉलबैक नेटवर्क स्थिति परिवर्तन (यानी अनफ्रीज़ के बाद) पर लगाया गया है

    फिर भी यदि आप लाइन पर कार्रवाई (1.) लेने के लिए और MKNetworkOperation.m में एक ब्रेकपाइंट जगह -checkAndRestoreFrozenOperations:

    [self enqueueOperation:pendingOperation] 
    

    जब नेटवर्क कनेक्टिविटी पुनर्स्थापित होने पर आप पाएंगे कि यह शुरू हो जाती है, और कहा कि लंबित ऑपरेशन आपके लंबित पोस्ट है। हालांकि, चूंकि एक नया एमकेनेटवर्क ऑपरेशन तत्काल किया गया है (और तब तक पूरा होने वाला ब्लॉक मौजूद नहीं हो सकता है) आपके onCompletion ब्लॉक को कभी भी नहीं कहा जाता है। कॉलबैक की बजाय अधिसूचना का उपयोग करना एक संभावित कामकाज होगा।

  3. संपूर्ण सुधार: से (2) कि शुरूआत भर में काम करेंगे एक और अधिक मजबूत दृष्टिकोण NSNotifications द्वारा ^{} ब्लॉक कॉलबैक को बदलने के लिए है। अपने एपडिलेगेट की तरह अपने श्रोताओं को जल्दी से पंजीकृत करें।यहां MKNetworkKit अधिसूचनाओं को समझने के लिए आवश्यक न्यूनतम परिवर्तन दिए गए हैं:

    3a। MKNetworkOperation.h

    में सम्मिलित सूचनाएं स्थिरांक
    #define MKNetworkOperationCompletionNotification @"MKNetworkOperationCompletionNotification" 
    #define MKNetworkOperationErrorNotification @"MKNetworkOperationErrorNotification" 
    

    3 बी। प्रसारण MKNetworkOperation.m -operationSucceeded में सफल अधिसूचना (सूचना है कि मैं postNotificationOnMainThread उपयोग करती हैं इसलिए ही कहा अधिसूचना मुख्य थ्रेड से सुनी जा सकती है और यूआई बदलने; NSOperation and NSNotificationCenter on the main thread देखें):

    -(void) operationSucceeded { 
        NSDictionary * aUserInfo = [NSDictionary dictionaryWithObjectsAndKeys: 
         self, NSStringFromClass([MKNetworkOperation class]), 
         nil]; 
        NSNotification * notification = [NSNotification notificationWithName:MKNetworkOperationCompletionNotification 
         object:nil 
         userInfo:aUserInfo]; 
        [[NSNotificationCenter defaultCenter] postNotificationOnMainThread:notification]; 
        ... 
    

    3c। प्रसारण MKNetworkOperation.m -operationFailedWithError

    -(void) operationFailedWithError:(NSError*) error { 
        self.error = error; 
        NSDictionary * aUserInfo = [NSDictionary dictionaryWithObjectsAndKeys: 
         self, NSStringFromClass([MKNetworkOperation class]), 
         error, NSStringFromClass([NSError class]), 
         nil]; 
        NSNotification * notification = [NSNotification notificationWithName:MKNetworkOperationErrorNotification 
         object:nil 
         userInfo:aUserInfo]; 
    
        [[NSNotificationCenter defaultCenter] postNotificationOnMainThread:notification]; 
        ... 
    

    3 डी में एक विफलता अधिसूचना। एक नहीं बल्कि लगातार वस्तु रजिस्टर, AppDelegate की तरह, एक श्रोता (अपंजीकृत के लिए मत भूलना) के रूप में:

    // Listen to POST changes 
        NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; 
        [defaultCenter addObserver:self 
         selector:@selector(mkNetworkOperationCompletionNotification:) 
         name:MKNetworkOperationCompletionNotification 
         object:nil]; 
        [defaultCenter addObserver:self 
         selector:@selector(mkNetworkOperationErrorNotification:) 
         name:MKNetworkOperationErrorNotification 
         object:nil]; 
    

    3e। क्या श्रोता की तरह लग सकता है की नमूना कोड:

    - (void)mkNetworkOperationCompletionNotification:(NSNotification*)notification { 
        MKNetworkOperation *operation = [[notification userInfo] 
         objectForKey:NSStringFromClass([MKNetworkOperation class])]; 
        NSLog(@"operationSucceeded: %@", [operation responseString]); 
    } 
    
    - (void)mkNetworkOperationErrorNotification:(NSNotification*)notification { 
        NSError * error = [[notification userInfo] objectForKey:NSStringFromClass([NSError class])]; 
        NSLog(@"operationFailedWithError: %@", [error localizedDescription]); 
    } 
    

ऐसा करें, आपका काम हो गया। एक्स

(संपादित पिछले जवाब में MKNetworkOperation.h के लिए अनावश्यक सुझाए गए परिवर्तनों को दूर करने, और कैसे^{} सीमाओं को पार करने को दिखाने के लिए पैरा 3. गयी।)

+1

आपके विस्तृत उत्तर, @gothicdev के लिए बहुत बहुत धन्यवाद। – msoler