2014-10-30 80 views
0

我正在發送試圖登錄信息,並等待來自Web服務的響應URLRequest找出如果用戶能/不能登錄。隊等待NSURLSessionDataTask完成

我希望的方式做到這一點是通過在他的&用戶名密碼用戶類型分爲兩個文本字段,然後按下一個按鈕,這將調用下面的函數。該函數將啓動一個NSURLSessionDataTask和構建結構用布爾成功/失敗的登錄並與相應的錯誤消息的NSString(如果有的話)。

的問題是,我的功能我NSURLSessionDataTask's完成塊已經執行完畢之前返回結構。有沒有辦法讓我強制我的程序等到這個任務超時或完成?或者,我可以在函數返回之前將完成塊的執行推送到主線程&上嗎?

謝謝!請讓我知道是否有任何澄清我需要做! (另外,我看到了一些類似的問題,這些問題圍繞着提到GCD的StackOverflow進行傳播,這是否是一種矯枉過正的解決方案?這些問題似乎都不是在談論完全相同的事情,或者在高於我目前的理解,我還是很新的Objective-C)

- (struct RequestReport) sendLoginRequest: (NSString*) username withPassword: (NSString *) password 

...(創建請求&設置HTTP體)

NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error){ 

    NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData: data options:0 error:nil]; 

    success = (BOOL)jsonObject[@"success"]; 
    statusText = (NSString *) jsonObject[@"errors"]; 

}]; 

[dataTask resume]; 

struct RequestReport rr; 
rr.status = statusText; 
rr.success = success; 

return rr; 
+0

對於這種類型的問題的典型的設計模式是通過當任務返回並顯示在平均時間的裝載指示器時執行的回調塊。該方法應該是無效的,並且回調塊在NSURLSessionDataTask的回調中執行。 – DBoyer 2014-10-30 23:16:09

+0

哦,我討厭寫更多的方法:PI希望有另一種解決方案,尤其是因爲我的程序確實有效地以「塊」,直到用戶登錄出於安全原因,沒有提供給非登錄功能用戶。 – 13rave 2014-10-30 23:17:54

+0

哦,等一下,你不是要寫另一種方法。回調塊?所以就像傳入一個委託函數(不知道它在Objective-c中稱爲什麼)作爲登錄函數的參數? – 13rave 2014-10-30 23:19:10

回答

4

你的方法應該是這樣的:

- (void) sendLoginRequest:(NSString*) username withPassword:(NSString *) password callback:(void (^)(NSError *error, BOOL success))callback 
    { 
    NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error){ 
     if (error) { 
      // Handle error 
     } 
     else { 
      callback(error, YES); 
     } 
    }]; 

    [dataTask resume]; 

} 

調用此方法像這樣:

[self sendLoginRequest:@"myUsername" password:@"password" callback:^(NSString *error, BOOL success) { 
    if (success) { 
     NSLog(@"My response back from the server after an unknown amount of time"; 
    } 
} 

對塊多閱讀和fuckingblocksyntax.com如何申報塊見Apple's Programming with Objective-C

+0

謝謝;我一直以完全錯誤的方式思考這個問題。我會考慮回調。 – 13rave 2014-10-30 23:24:48

+0

我對這裏的語法有點困惑。 – 13rave 2014-10-30 23:25:58

+0

(哎呀,我不是故意按enter鍵。) (無效(^)(NSArray中*對象))回調 ^什麼的NSArray *的對象? – 13rave 2014-10-30 23:26:27