0

経由でオブジェクトのコレクションをロードしようとしてRestKitいますが、この操作がメイン スレッドをブロックしていることがわかりました。具体的にUIViewControllerは、メッセージに が表示されたときにこの機能が呼び出され-(void)viewDidAppear:(BOOL)animated;ます。リクエストが読み込まれている間、ユーザーは UI を操作できず、操作が完了するまで待機する必要があります。

RestKit に要求を非同期で実行するように指示するにはどうすればよいでしょうか (既に実行されていると思いました)、メイン スレッドのブロックを停止するにはどうすればよいですか?

-(void)rtrvArtistsByStudio:(ISStudio *)studio
{
NSLog(@"Retrieving Artists for studio %ld", [studio studioID]);
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];

NSDictionary *params = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"%ld", [studio studioID]] forKey:@"studioID"];

NSURLRequest *request = [restkit requestWithObject:nil method:RKRequestMethodGET path:@"/restAPI/rtrvArtistsByStudio" parameters:params];
RKManagedObjectRequestOperation *operation = [restkit managedObjectRequestOperationWithRequest:request managedObjectContext:restkit.managedObjectStore.persistentStoreManagedObjectContext success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    NSArray *artists = [mappingResult array];
    [studio setArtists:artists];
    [notificationCenter postNotificationName:nStudioLoadedArtists object:studio];
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    NSLog(@"Failed to load artists for studio %ld due to %@", [studio studioID], error);
    [notificationCenter postNotificationName:nStudioFailedLoadingArtists object:studio];
}];
[restkit enqueueObjectRequestOperation:operation];
}

restkit編集:のインスタンスへのポインタであることにも注意してくださいRKObjectManager

RestKit のバージョンは 0.20 です

4

2 に答える 2

0

それは実際には私自身のせいでした(もちろん)。UIViewControllerいくつかのトランジションを実行するカテゴリがあります。移行中はUIApplication、移行が完了するまでタッチイベントを無視します(0.2秒、非常に短い)。私はこれが存在したことを完全に忘れました。

いくつかのリモートオブジェクトをロードしているので、viewDidAppearそれが完了するまでタッチイベントを無視していました。タッチ無視を削除すると、問題が修正されました。

于 2013-01-13T14:24:52.520 に答える
0

リクエストは間違いなく非同期でディスパッチされています。Xcode UI の一時停止ボタンを押してスレッドを確認すると、リクエスト中にメイン スレッドとバックグラウンド スレッドで何が起こっているのでしょうか? これにより、スレッドの閉塞の原因についての洞察が得られるはずです。

于 2013-01-12T21:20:33.380 に答える