2013-01-12 49 views
0

我試圖通過RestKit加載對象的集合,並且發現這個操作阻塞了主線程。特別是,當-(void)viewDidAppear:(BOOL)animated;消息中出現UIViewController時,會調用此功能。只要加載請求,用戶就無法與UI進行交互,並且必須等待操作完成。iOS:RestKit入隊管理對象操作阻止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

+0

您正在運行哪個版本的RestKit? – Alex

+0

0.20.0,編輯並添加到原始問題。 – kz3

回答

0

原來,這實際上是我自己的錯(當然)。我有一個UIViewController類別執行一些轉換。在轉換過程中,我有UIApplication忽略觸摸事件,直到轉換完成(0.2秒,非常簡短)。我完全忘記了這是存在的。

因爲我正在加載一些遠程對象在viewDidAppear它仍然忽略觸摸事件,直到完成。刪除觸摸忽略解決了問題。

0

該請求肯定是異步調度的。如果按下Xcode UI中的暫停按鈕並查看線程,請求期間主線程和後臺線程上發生了什麼?這應該提供洞察導致線程阻塞的原因。

+0

原來這是我自己的錯,RestKit不是怪(看我的回答)。不管怎麼說,多謝拉! – kz3