簡體   English   中英

無法使用AFNetworking 3.0從異步塊獲取響應

[英]Can't get response from async block using AFNetworking 3.0

我是IOS開發的新手,所以我可能只是缺少一些基礎知識。 已經為這個問題苦苦掙扎了2天。 所以,就在這里。 我的API類中有一個數據任務:

//request generation, putting url and dictionary into it

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if(!error)
    {
        self.jsonDictionary = responseObject;
        NSInteger HTTPStatusCode = [(NSHTTPURLResponse *)response statusCode];
        NSLog(@"RESPONSE DATA:  %@", self.jsonDictionary);
        self.didSendRequest = YES;
    }
    else
    {
        self.didSendRequest = NO;
        NSLog(@"ERROR:  %@", error);
    }
}];
[dataTask resume];

然后像這樣檢索json字典:

-(NSDictionary *)returnJSON{
if(self.didSendRequest) return self.jsonDictionary;
else NSLog(@"No dictionary dowloaded");
return self.jsonDictionary;}

然后,在其他類中,我將url和dictionary傳遞給數據任務方法,並像這樣獲得響應:

-(NSDictionary*)userLogin : (NSString* )email : (NSString*) password {
dataTaskClass* aph = [[dataTaskClass alloc] init];

NSDictionary *userParams = [[NSDictionary alloc] initWithObjectsAndKeys:
                            email,@"email",
                            password,@"password",
                            nil];
[aph postRequest: @"myUrl"];
return dataTaskClass.returnJSON;}

最后,我在這樣的視圖控制器類中調用它:

    //button click method here
response = [lh userLogin : userEmail : userPass];
            if (response) {//do some action}

所以,是的,正如您所看到的,我調用了一個方法,該方法然后異步執行下載任務,然后我立即檢查返回值,當然是“空”。 那么如何將返回值與dataTask同步,或以其他任何方式檢查其完成?

正如預期的那樣,已經嘗試了愚蠢的“ while循環”和信號量方法,它們都掛了主線程。 嘗試了一些帶有通知的內容,但最終沒有結果。

我很確定它有一個該死的簡單解決方案,但無法實現。

希望得到任何幫助。

是的,您缺少一些基本知識。

您不能調用異步操作的方法並立即獲得答案。 解決的辦法是編寫采用完成塊的方法。 然后,您在完成塊中傳遞要執行的代碼。 在結果可用之前,方法調用立即返回,但是下載任務完成后,將調用完成塊代碼。

我寫了一個SO答案,其中包括一個示例應用程序,但它是用Swift編寫的。 如果您是iOS開發的新手,並且正在Objective-C中工作,則可能很難遵循。

如果您只是在學習iOS開發,則應認真考慮學習Swift。 蘋果公司清楚地表明,Swift是iOS開發的未來。 學習Objective-C也很有用,但我建議您將重點放在Swift上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM