0

これはおそらく非常に些細な質問ですが、情報を取得するために API への接続を設定しています。現在、viewDidLoad ですべての設定が完了しています。ユーザーが後でアクセスできるようにこの情報を配置するより効率的な方法があることは知っていますが、Objective-C の経験が浅すぎてその方法を知ることができません。これが、現時点ですべてをレイアウトした方法です。

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.myurl.com"]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];
    NSData *myResponse = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil];

    NSString *myString = [[NSString alloc] initWithData:myResponse encoding:NSUTF8StringEncoding];

    SBJsonParser *myParser = [[SBJsonParser alloc] init];

    NSArray *myData = [parser objectWithString:myString error:nil];
4

2 に答える 2

1

これを試して:

- (void)loadAndParseURL:(NSString *)URLString
             completion:(void (^)(NSArray *data))completion {

    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:URLString]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];
    dispatch_async(dispatch_get_global_queue(DISPATH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      NSData *myResponse = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil];

      NSString *myString = [[NSString alloc] initWithData:myResponse encoding:NSUTF8StringEncoding];

      SBJsonParser *myParser = [[SBJsonParser alloc] init];

      NSArray *myData = [parser objectWithString:myString error:nil];
      completion(myData);
    });
}

completion配列をパラメーターとして受け取り、カスタマイズされたコード ブロックを実行するブロック (無名関数ポインター) です。ブロックはローカル変数の値、別名「環境」を保持し、実行時にその内容を評価します (通常、何らかの遅延があります)。この例では、myDataが から解析された後ですmyStringdispatch_asyncリクエストを送信し、他の処理を行う匿名ブロックをバックグラウンド キューに入れます (もちろん、バックグラウンド スレッドで)。completionしたがって、このメソッドへの呼び出しは、応答が受信される前に返されるため、ブロック内で後で何かを配置する必要があります。

于 2013-01-23T16:44:49.957 に答える
0

それをスレッドにスピンオフすることがあなたが探しているものである場合、私はsendAsynchronousRequestを使用します

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:URLString]
                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                      timeoutInterval:60.0];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
   NSString *myString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
   SBJsonParser *myParser = [[SBJsonParser alloc] init];

    NSArray *myData = [parser objectWithString:myString error:nil];

   // Do what you want with the response and subscribe 
   //anywhere in your code to get notified when it completed.
   [[NSNotificationCenter defaultCenter] 
          postNotificationName:@"NotifyMeWhenDone" 
                        object:self];

}];
于 2013-01-23T17:29:55.343 に答える