2016-08-27 6 views
1

私の問題は、アプリケーション内に定期的に一連のネットワーク要求をループ内で作成する必要があるということです。これは別のスレッドの内部にあり、要求の性質(ローカルネットワーク上のデバイスに対する応答は単純です)のために、これを同期して実行したいと思います。ネットワーク通信はdatabaseControllerクラスより別のnetworkingクラスです。ios同期ネットワーク要求ハンドラが結果を返す

私が完了ハンドラ内から何か

+ (void)GetMessages 
{ 
    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURLRequest *request = [networking makeAuthenticatedRequest:@"subpath.html"]; 
    //NSString* returnable; 
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
            completionHandler: 
           ^(NSData *data, NSURLResponse *response, NSError *error) { 
            NSString* newStr = [[NSString alloc] initWithData:data 
                 encoding:NSUTF8StringEncoding]; 
            //returnable = newStr; 
            //return(newStr) 
            NSLog(newStr); 
           }]; 
    [task resume]; 
} 

上記のコードは動作しますが、要求の結果を印刷除いて何もしないを返すためにnetworkingクラスのメソッドを取得することはできません。私がコメントアウトしたもののどれかを試してみると、必要な変更は何もできません。私は呼び出し元オブジェクトへの参照を渡して、完了ハンドラの中にnewStrを格納するためのプロパティを更新しようとしましたが、それでも動作しません。

私は可能な試みをしていますか?もしそうなら、どのように?

コードをios 7-9と互換性があるようにする必要があります。あなたは次の操作を行う必要があり

答えて

1

NSURLSession *session = [NSURLSession sharedSession]; 
NSMutableURLRequest *request = 
[NSMutableURLRequest requestWithURL:[NSURL 
            URLWithString:@"https://www.yahoo.com"] 
       cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData 
        timeoutInterval:10 
]; 

__block NSString* returnable; // notice the __block here 
NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
       completionHandler: 
       ^(NSData *data, NSURLResponse *response, NSError *error) { 
       NSString* newStr = [[NSString alloc] initWithData:data 
            encoding:NSUTF8StringEncoding]; 
       returnable = newStr; 
       // return(newStr); You cant return this here. Because the callback doesn't permit you to do so. 
       NSLog(@"%@", newStr); 
     }]; 
[task resume]; 
関連する問題