Каков правильный способ перезагрузки данных в UICollectionView?

Если я получаю информацию из альбома в библиотеке активов пользователей, и они добавляют изображение или удаляют его, пока мое приложение находится в фоновом режиме. Как их лучше перезагрузить.

В настоящее время у меня есть:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(assetsLibraryDidChange:) name:ALAssetsLibraryChangedNotification object:_photoListArray];

Чтобы получить начальное уведомление, а затем он вызывает мой метод assetsLibraryDidChange:

Который выглядел так:

- (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 и просто каждый раз перезагружать его.


К чему я клоню:

Кажется, существует разрыв между получением моим приложением уведомления и его фактическим обновлением. Приложение Apple для фотографий по умолчанию, кажется, может сделать это примерно за 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

person lostAstronaut    schedule 16.08.2013    source источник
comment
Уведомление отправляется не в основной поток? В этом случае вы должны отправить reloadData в основной поток.   -  person Martin R    schedule 16.08.2013


Ответы (1)


любые изменения пользовательского интерфейса должны выполняться в основном потоке. Попробуйте:

- (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];
        }
    }
}
person abbood    schedule 16.08.2013
comment
Эй, я считаю, что вам не хватает ');' в операторе if и else. - person lostAstronaut; 16.08.2013
comment
Я демонстративно исправил проблему со скоростью, хотя она не перезагружает ячейки, может быть, setNeedsLayout? - person lostAstronaut; 16.08.2013
comment
Или я должен использовать пакетное обновление? - person lostAstronaut; 16.08.2013
comment
Никакая перезагрузка не должна быть в порядке. Но только для того, чтобы изолировать проблему. Можете ли вы поместить оператор nslog для note.userinfo, а также as_photoListArray в каждом случае и вставить вывод? - person abbood; 16.08.2013
comment
@lostAstronaut гудит .. так что проблема в том, что вы не получаете уведомления о каких-либо изменениях в массиве .. можете ли вы повторить приведенные выше операторы NSLog, но без кода dispatch_async(dispatch_get_main_queue(),? - person abbood; 16.08.2013
comment
Обновлено для без отправки. - person lostAstronaut; 16.08.2013
comment
Итак, очевидно, ваше уведомление не сообщает о том, что вы хотите... мне понадобится больше кода, чтобы увидеть, что происходит... Можете ли вы поместить его в репозиторий, например, на github или что-то в этом роде? - person abbood; 16.08.2013