0

我正在尝试通过加载对象集合RestKit并发现此操作阻塞了主线程。UIViewController具体来说,当消息中出现a 时会调用此功能-(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

请求肯定是异步分派的。如果在 Xcode UI 中按下暂停按钮并查看线程,请求期间主线程和后台线程发生了什么?这应该可以深入了解导致线程阻塞的原因。

于 2013-01-12T21:20:33.380 回答
0

事实证明,这实际上是我自己的错(当然)。我有一个UIViewController执行一些转换的类别。在过渡期间,我有UIApplication忽略触摸事件,直到过渡完成(0.2 秒,非常简短)。我完全忘记了它的存在。

因为我正在加载一些远程对象,viewDidAppear所以它仍然忽略触摸事件,直到完成。删除触摸忽略解决了这个问题。

于 2013-01-13T14:24:52.520 回答