[英]What is the correct way to reload data in a UICollectionView?
如果我從用戶資產庫中的相冊中獲取信息,並且他們在我的應用程序處於后台時添加了圖片或從中刪除了圖片。 什么是重新加載它們的最佳方法。
目前我有:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(assetsLibraryDidChange:) name:ALAssetsLibraryChangedNotification object:_photoListArray];
要獲取初始通知,然后調用我的assetLibraryDidChange方法:
看起來像這樣:
- (void)assetsLibraryDidChange:(NSNotification *)note
{
//dict nil reload
if(note.userInfo==nil) {
[self.CoverView reloadData];
return;
}
//dict empty no reload
if(note.userInfo.count == 0) {
NSLog(@"empty");
return;
}
else {
[self.CoverView reloadData];
}
}
盡管我正在考慮刪除所有的if和else,並且每次都重新加載它。
我要去的是:
我的應用收到通知和實際更新之間似乎有差距。 蘋果的默認照片應用似乎能夠在3-4秒內完成,而我的照片幾乎要花10秒鍾! 有沒有更有效的方法可以做到這一點?
我繼續將nslog放在所有if之前,以查看該方法也被調用了多少次。
//Library Updated
- (void)assetsLibraryDidChange:(NSNotification *)note
{
NSLog(@"photos updated");
//dict nil reload
if(note.userInfo==nil) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.CoverView reloadData];
NSLog(@"note: %@", note.userInfo);
NSLog(@"array: %@", _photoListArray);
return;
});
}
//dict empty no reload
if(note.userInfo.count == 0) {
NSLog(@"empty");
return;
}
else {
dispatch_async(dispatch_get_main_queue(), ^{
[self.CoverView reloadData];
NSLog(@"note2: %@", note.userInfo);
NSLog(@"array2: %@", _photoListArray);
});
}
}
結果是:
2013-08-16 10:41:51.622 app[180:1803] photos updated
2013-08-16 10:41:51.635 app[180:60b] note2: {
ALAssetLibraryUpdatedAssetsKey = "{(\n assets-library://asset/asset.JPG?id=CCA17BE2-5633-4FFE-A113-F21E37B9882C&ext=JPG,\n assets-library://asset/asset.JPG?id=7B05283E-87A5-4CFE-BDBE-7703E311E0DF&ext=JPG,\n assets-library://asset/asset.JPG?id=5B1E736F-E21E-4400-9679-5DE8215AC09D&ext=JPG\n)}";
}
2013-08-16 10:41:51.638 app[180:60b] array2: (
"<Media: 0x176b3410>",
"<Media: 0x176b5b00>",
"<Media: 0x176b5c90>",
"<Media: 0x176b7590>",
"<Media: 0x176b47c0>",
"<Media: 0x176b7e10>",
"<Media: 0x176b83b0>",
"<Media: 0x176b8990>",
"<Media: 0x176b8f40>",
"<Media: 0x176b9530>",
"<Media: 0x176ba160>",
"<Media: 0x176ba960>",
"<Media: 0x175794d0>",
"<Media: 0x175503c0>",
"<Media: 0x17571f80>",
"<Media: 0x1756dc20>",
"<Media: 0x17571060>",
"<Media: 0x1757b0d0>",
"<Media: 0x1757b8f0>",
"<Media: 0x1757bee0>",
"<Media: 0x1757bcf0>",
"<Media: 0x1757ca80>",
"<Media: 0x1757cbd0>"
)
2013-08-16 10:41:51.827 app[180:3e07] photos updated
2013-08-16 10:41:51.831 app[180:3e07] empty
2013-08-16 10:41:51.893 app[180:3e07] photos updated
2013-08-16 10:41:51.897 app[180:3e07] empty
2013-08-16 10:41:52.059 app[180:3e07] photos updated
2013-08-16 10:41:52.074 app[180:3e07] empty
2013-08-16 10:41:52.092 app[180:5117] photos updated
2013-08-16 10:41:52.095 app[180:5117] empty
Media對象是一個類,我只是用來添加數據並將其與它們一起存儲。 名稱,分機號 不會改變實際圖像。
沒有調度:
2013-08-16 11:37:53.246 app[296:3d07] photos updated
2013-08-16 11:37:53.255 app[296:3d07] note2: {
ALAssetLibraryUpdatedAssetsKey = "{(\n assets-library://asset/asset.JPG?id=CCA17BE2-5633-4FFE-A113-F21E37B9882C&ext=JPG,\n assets-library://asset/asset.PNG?id=D72A00CE-4198-45BE-BCC5-8DEB8419A5C8&ext=PNG,\n assets-library://asset/asset.JPG?id=5B1E736F-E21E-4400-9679-5DE8215AC09D&ext=JPG\n)}";
}
2013-08-16 11:37:53.260 app[296:3d07] array2: (
"<Media: 0x176271b0>",
"<Media: 0x17577920>",
"<Media: 0x17579c50>",
"<Media: 0x17579eb0>",
"<Media: 0x17579e00>",
"<Media: 0x1757a9b0>",
"<Media: 0x1757af50>",
"<Media: 0x1757b540>",
"<Media: 0x1757baf0>",
"<Media: 0x1757c0e0>",
"<Media: 0x17656510>",
"<Media: 0x176570f0>",
"<Media: 0x176572b0>",
"<Media: 0x17657840>",
"<Media: 0x17657e20>",
"<Media: 0x17658400>",
"<Media: 0x176589e0>",
"<Media: 0x17659270>",
"<Media: 0x17650470>",
"<Media: 0x17659380>",
"<Media: 0x176507a0>",
"<Media: 0x17650ab0>",
"<Media: 0x17659cb0>",
"<Media: 0x1765a340>"
)
2013-08-16 11:37:53.404 app[296:4e17] photos updated
2013-08-16 11:37:53.408 app[296:4e17] empty
2013-08-16 11:37:53.450 app[296:3d07] photos updated
2013-08-16 11:37:53.458 app[296:3d07] empty
2013-08-16 11:37:53.466 app[296:4e17] photos updated
2013-08-16 11:37:53.470 app[296:4e17] empty
任何更改UI的工作都應在主線程上完成。
- (void)assetsLibraryDidChange:(NSNotification *)note
{
//dict nil reload
if(note.userInfo==nil) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.CoverView reloadData];
return;
}
}
//dict empty no reload
if(note.userInfo.count == 0) {
NSLog(@"empty");
return;
}
else {
dispatch_async(dispatch_get_main_queue(), ^{
[self.CoverView reloadData];
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.