2016-03-01 116 views
1

我在一個名爲WebServices的類中實現了一個RESTful API。我從我的應用程序中的其他類調用此類中的方法,並希望在成功完成Web服務時執行操作。我有一個完成塊作爲我的方法頭文件的一部分,但我不確定是否正確使用它們,因爲應用程序似乎無法到達方法調用的完成部分。這是我打電話我的方法:Web服務完成後的完成塊?

[services callUnregisterForPushNotifications:savedAccessToken pushToken:savedPushToken completionBlock:^(NSMutableArray *resultsArray) { 

     NSLog(@">>> COMPLETE! <<<"); 

     [self.loadingView removeFromSuperview]; 
    }]; 

而且方法我打電話看起來像這樣:

- (void)callUnregisterForPushNotifications:(NSString *)accessToken 
           pushToken:(NSString *)pushToken 
         completionBlock:(void (^)(NSMutableArray *resultsArray))completion{ 

    NSLog(@"UNREGISTER FOR PUSH CALLED!"); 

    NSLog(@"PUSH TOKEN %@", pushToken); 

    NSString *appendUrl = @"alerts/unregisterpush/"; 

    NSLog(@"APPEND URL %@",appendUrl); 

    NSURL *unregisterUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", BaseURLString, appendUrl]]; 
    NSLog(@"UNREGISTER URL: %@",unregisterUrl); 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:unregisterUrl 
                  cachePolicy:NSURLRequestUseProtocolCachePolicy 
                 timeoutInterval:30.0]; 

    [request setHTTPMethod:@"PUT"]; 

    NSString *appendToken = [NSString stringWithFormat:@"Bearer %@", accessToken]; 
    NSLog(@"TOKEN: %@",appendToken); 

    [request addValue:appendToken forHTTPHeaderField:@"Authorization"]; 
    [request addValue:@"application/json, text/plain, */*" forHTTPHeaderField:@"Accept"]; 
    [request addValue:@"application/json;charset=UTF-8" forHTTPHeaderField:@"Content-Type"]; 


    NSString *postString = [NSString stringWithFormat:@"{\"Guid\":\"%@\"}",pushToken]; 
    NSLog(@"POST STRING: %@",postString); 
    [request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSLog(@"REQUEST %@",request); 

    [NSURLConnection sendAsynchronousRequest:request 
             queue:[NSOperationQueue mainQueue] 
          completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

                   NSLog(@"UNREGISTER PUSH NOTIFICATIONS RESPONSE: %@", response); 
                   NSLog(@"UNREGISTER PUSH NOTIFICATIONS ERROR: %@", error); 
                   NSLog(@"UNREGISTER PUSH NOTIFICATIONS DATA: %@", data); 

           NSData *_data = data;// ... whatever 
           NSMutableString *_string = [NSMutableString stringWithString:@""]; 
           for (int i = 0; i < _data.length; i++) { 
            unsigned char _byte; 
            [_data getBytes:&_byte range:NSMakeRange(i, 1)]; 
            if (_byte >= 32 && _byte < 127) { 
             [_string appendFormat:@"%c", _byte]; 
            } else { 
             [_string appendFormat:@"[%d]", _byte]; 
            } 
           } 
           NSLog(@"UNREGISTER PUSH RESPONSE: %@", _string); 

           id obj= [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; 
           if (!obj) { 
            //NSLog(@"REGISTER PUSH NOTIFICATIONS ERROR: %@", error); 

           } else { 
            //NSLog(@"REGISTER PUSH NOTIFICATIONS DATA: %@", obj); 

            //self.accessToken = [obj valueForKey:@"access_token"]; 
            //NSLog(@"ACCESS TOKEN: %@",self.accessToken); 
           } 

          }]; 
} 

任何意見/輸入,將不勝感激,在此先感謝!

+0

哪部分沒被調用?它不會執行「註銷被觸發!」塊,還是不做「>>> COMPLETE!<<<」塊,還是它不做? – Stonz2

+0

請注意,NSURLConnection已被棄用。您應該轉而使用NSURLSession。 – Joride

回答

3

在你else塊你應該調用完成處理,像這樣:

// [code omitted for brevity] 

         NSLog(@"UNREGISTER PUSH RESPONSE: %@", _string); 

         id obj= [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; 
         if (!obj) { 
          //NSLog(@"REGISTER PUSH NOTIFICATIONS ERROR: %@", error); 

         } else { 
          completionHandler(resultsArray); // add this line to actually call the completion block passed in 
          //NSLog(@"REGISTER PUSH NOTIFICATIONS DATA: %@", obj); 

          //self.accessToken = [obj valueForKey:@"access_token"]; 
          //NSLog(@"ACCESS TOKEN: %@",self.accessToken); 
         } 


        }]; 

還要確保實際的數組,而不是resultsArray參數我傳遞來傳遞。

你基本上正在做的是傳遞一個函數(或「塊」),它不知道何時執行(任何異步任務完成後你都必須自己做)。所以,你在該塊通過從您的調用方法:

[services callUnregisterForPushNotifications:savedAccessToken pushToken:savedPushToken completionBlock:^(NSMutableArray *resultsArray) { 

     NSLog(@">>> COMPLETE! <<<"); 

     [self.loadingView removeFromSuperview]; 
    }]; 

包含在大括號中的代碼塊被傳遞給函數callUnregisterForPushNotifications:pushToken:completionHandler:並分配給completionHandler參數,它現在包含傳入的代碼塊最初調用該方法時。接收到completionHandler塊的方法負責在異步任務(網絡請求)完成後調用它(如您在我發佈的第一個片段中看到的那樣)。

completionHandler(resultsArray); 

這樣一來,一旦你的請求已經完成(在else塊),你就可以執行中傳遞結束塊。這將有效地意味着「執行我傳入較早因爲現在的代碼塊我們有來自網絡運營的數據。「