使用webservices C#,我想显示有关产品的信息。要加载数据,我使用dispatch_async作为队列执行如下:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//Show loading
[ShareAppDelegate showloading];
//LOAD PRODUCT INFO
productDatasources = [self loadProductInfo];
//LOAD COMMENT
commentDatasources = [self loadComment];
//LOAD PRODUCT PHOTOS
photoDatasources = [self loadPhotos];
dispatch_async(dispatch_get_main_queue(), ^{
[ShareAppDelegate hideloading];
//UPDATE PRODUCT INFO TO UI
[self showProductInfoWithDatasource:productDatasources];
//UPDATE COMMENT INFO TO UI
[self showCommentWithDatasource:commentDatasources];
//UPDATE PHOTO INFO TO UI
[self showProductPhotoWithDatasource:photoDatasources];
});
});
但有时它工作正常,我的意思是,我的ProductInfo,评论和照片可以加载并显示在我的屏幕上。但有时,只能加载ProductInfo,注释和照片无法加载并获得null。有时,3为空。
我发现,在我测试过的所有情况下,服务器总是正确地返回结果,结果不为空。但是我的dispatch_get_main_queue似乎在完全收到数据之前就已经执行了。
有人知道我的情况。 dispatch_async是否合适。请事先提前。
修改
我找到了解决这个问题的方法。因为在另一个视图中,我声明并启动NSTimer来调用另一个webservices。此Web服务每运行5秒钟,以通知用户是否有来自服务器的任何通知。
timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(loadNotification:) userInfo:nil repeats:YES];
因此,在这种情况下,有时我调用了2个webservices并同时接收数据,这就是GCD无法正确接收数据的原因。我可以更新通知并仍然正确执行上述GCD吗?
答案 0 :(得分:2)
您在后台线程(productDataSources,commentDataSources,photoDataSources)中分配的属性,它们是如何声明的?他们是否在其他地方访问?在这种情况下,可能是错误的。
主线程使用的属性绝不能被后台线程更改,这是我怀疑在这里发生的事情。相反,在后台线程上使用临时变量,然后当你回到主线程时更改真实变量,如下所示:
//Show loading on main thread (important)
[ShareAppDelegate showloading];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//LOAD PRODUCT INFO
NSArray *tempProductDatasources = [self loadProductInfo];
//LOAD COMMENT
NSArray *tempCommentDatasources = [self loadComment];
//LOAD PRODUCT PHOTOS
NSArray *tempPhotoDatasources = [self loadPhotos];
dispatch_async(dispatch_get_main_queue(), ^{
// Set the temp variables when on the main thread
productDatasources = tempProductDatasources;
// ... etc
[ShareAppDelegate hideloading];
//UPDATE PRODUCT INFO TO UI
[self showProductInfoWithDatasource:productDatasources];
//UPDATE COMMENT INFO TO UI
[self showCommentWithDatasource:commentDatasources];
//UPDATE PHOTO INFO TO UI
[self showProductPhotoWithDatasource:photoDatasources];
});
});