UICollectionView reloadData, iOS 7'de düzgün çalışmıyor


93

Uygulamalarımı, çoğunlukla sorunsuz bir şekilde ilerleyen iOS 7'de çalışacak şekilde güncelliyorum. Birden fazla uygulamada reloadDataa yönteminin UICollectionViewControllereskisi gibi hareket etmediğini fark ettim .

Ben yük olacak UICollectionViewController, doldurmak UICollectionView, normal olarak bazı verilerle. Bu ilk seferde harika çalışıyor. Bununla birlikte, yeni veri talep edersem (doldurursam UICollectionViewDataSource) ve sonra çağırırsam reloadData, veri kaynağını numberOfItemsInSectionve için sorgulayacaktır numberOfSectionsInCollectionView, ancak cellForItemAtIndexPathdoğru sayıda arama yapmıyor gibi görünüyor .

Kodu yalnızca bir bölümü yeniden yükleyecek şekilde değiştirirsem, düzgün çalışacaktır. Bu benim için bunları değiştirmem sorun değil, ama buna mecbur kalmam gerektiğini düşünüyorum. reloadDatatüm görünür hücreleri belgelere göre yeniden yüklemelidir.

Bunu başka gören oldu mu?


5
Aynı burada, iOS7GM'de, daha önce iyi çalıştı. reloadDataViewDidAppear'dan sonra aramanın sorunu çözdüğünü, korkunç geçici çözümünü ve düzeltilmesi gerektiğini fark ettim . Umarım birisi burada yardımcı olur.
jasonIM

1
Aynı sorunu yaşıyorum. Kod iOS6'da iyi çalışıyordu. uygun sayıda hücre döndürülmesine rağmen artık cellforitematindexpath'i çağırmıyor
Avner Barr

Bu, 7.0 sonrası bir sürümde düzeltildi mi?
William Jockusch

Hâlâ bu konuyla ilgili sorunlarla karşılaşıyorum.
Anıl

[CollectionView setFrame] 'i anında değiştirdikten sonra benzer sorun; her zaman bir hücreyi kuyruktan çıkarır ve veri kaynağındaki sayıdan bağımsız olarak budur. Burada her şeyi ve daha fazlasını denedim ve etrafından dolanamadım.
RegularExpression

Yanıtlar:


72

Bunu ana ileti dizisinde zorla:

dispatch_async(dispatch_get_main_queue(), ^ {
    [self.collectionView reloadData];
});

1
Daha fazlasını açıklayabilir miyim emin değilim. Araştırdıktan, araştırdıktan, test ettikten ve inceledikten sonra. Bunun bir iOS 7 hatası olduğunu hissediyorum. Ana iş parçacığını zorlamak, UIKit ile ilgili tüm mesajları çalıştıracaktır. Görünüme başka bir görüntü denetleyicisinden geçerken bununla karşılaşıyorum. ViewWillAppear'daki verileri yeniliyorum. Veri ve koleksiyon görünümü yeniden yükleme çağrısını görebiliyordum, ancak kullanıcı arayüzü güncellenmedi. Ana iş parçacığını (UI iş parçacığı) zorladı ve sihirli bir şekilde çalışmaya başladı. Bu sadece IOS 7'de.
Shaunti Fondrisi

6
Bu pek mantıklı değil çünkü reloadData'yı ana iş parçacığından çağıramazsınız (ana iş parçacığından görünümleri güncelleyemezsiniz) bu nedenle bu, bazı yarış koşulları nedeniyle istediğiniz şeyle sonuçlanan bir yan etkidir.
Raphael Oliveira

7
Ana kuyruktan ana kuyrukta gönderim, yürütmeyi bir sonraki çalıştırma döngüsüne kadar geciktirir ve şu anda kuyruğa alınmış her şeyin ilk olarak yürütülmesine izin verir.
Joony

2
Teşekkürler!! Hala Joony argümanının doğru olup olmadığını anlamıyorum çünkü çekirdek veri talebi zamanı tüketiyor ve cevabı erteleniyor veya willDisplayCell'de verileri yeniden yüklüyorum.
Fidel López

1
Bunca zaman vay canına ve bu hala ortaya çıkıyor. Bu gerçekten bir yarış durumudur veya olay görüntüleme yaşam döngüsü ile ilgilidir. görünüm "Will" görünür zaten çizilmiş olurdu. İyi fikir Joony, teşekkürler. Sonunda bu maddeyi "cevaplanmış" olarak ayarlayabileceğimizi mi düşünüyorsunuz?
Shaunti Fondrisi

64

Benim durumumda, veri kaynağındaki hücre / bölüm sayısı hiç değişmedi ve sadece ekranda görünen içeriği yeniden yüklemek istedim ..

Bunu arayarak aşmayı başardım:

[self.collectionView reloadItemsAtIndexPaths:[self.collectionView indexPathsForVisibleItems]];

sonra:

[self.collectionView reloadData];

6
Bu satır uygulamamın çökmesine neden oldu - "*** içinde onaylama hatası - [UICollectionView _endItemAnimations], /SourceCache/UIKit_Sim/UIKit-2935.137/UICollectionView.m:3840"
Lugubrious

@Lugubrious Muhtemelen aynı anda başka animasyonlar da yapıyorsunuz .. onları bir performBatchUpdates:completion:bloğa yerleştirmeyi deneyin ?
liamnichols

Bu benim için çalıştı, ancak neden gerekli olduğunu anladığımdan emin değilim. Sorunun ne olduğu hakkında bir fikriniz var mı?
Jon Evans

@JonEvans Maalesef hiçbir fikrim yok .. iOS'ta bir tür hata olduğuna inanıyorum, daha sonraki sürümlerde çözülüp çözülmediğinden emin değilim ama o zamandan beri test etmediğim ve sorunu yaşadığım proje hayır uzun benim sorunum :)
liamnichols

1
Bu böcek tam bir saçmalık! CollectionView'umu yeniden yüklediğimde tüm hücrelerim - rastgele - kayboluyordu, yalnızca koleksiyonumda belirli bir hücre türü varsa. Üzerinde iki gün kaybettim çünkü ne olduğunu anlayamadım ve şimdi çözümünüzü uyguladığıma ve işe yaradığına göre, neden şimdi çalıştığını hala anlamıyorum. Bu çok sinir bozucu! Her neyse, yardım için teşekkürler: D !!
CyberDandy

26

Tam olarak aynı sorunu yaşadım, ancak neyin yanlış gittiğini bulmayı başardım. Benim durumumda , collectionView: cellForItemAtIndexPath'den reloadData'yı çağırıyordum : bu doğru görünmüyor.

Arasında Sevk çağrı reloadData ana kuyruğuna bir kez ve sonsuza sorun giderildi.

  dispatch_async(dispatch_get_main_queue(), ^{
    [self.collectionView reloadData];
  });

1
[self.collectionData.collectionViewLayout geçersizateLayout] için bu satırın ne olduğunu bana söyleyebilir misiniz?
iOSDeveloper

Bu benim için de çözdü - benim durumumda reloadDatabir değişim gözlemcisi tarafından çağrılıyordu.
sudo make install

Bu durum için de geçerlidircollectionView(_:willDisplayCell:forItemAtIndexPath:)
Stefan Arambasich

20

Bazı öğeleri yeniden yüklemek benim için işe yaramadı. Benim durumumda ve yalnızca kullandığım collectionView'da yalnızca bir bölüm olduğu için, yalnızca o bölümü yeniden yüklerim. Bu sefer içerikler doğru şekilde yeniden yüklenir. Bunun yalnızca iOS 7'de (7.0.3) olması garip

[self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];

12

İOS 7'de reloadData ile aynı sorunu yaşadım. Uzun hata ayıklama oturumundan sonra sorunu buldum.

İOS7'de, UICollectionView üzerindeki reloadData, henüz tamamlanmayan önceki güncellemeleri iptal etmez (performBatchUpdates içinde çağrılan güncellemeler: blok).

Bu hatayı çözmek için en iyi çözüm, şu anda işlenen tüm güncellemeleri durdurmak ve reloadData'yı çağırmaktır. Bir performBatchUpdates bloğunu iptal etmenin veya durdurmanın bir yolunu bulamadım. Bu nedenle, hatayı çözmek için, şu anda işlenen bir performBatchUpdates bloğu olup olmadığını gösteren bir bayrak kaydettim. Şu anda işlenmiş bir güncelleme bloğu yoksa, reloadData'yı hemen çağırabilirim ve her şey beklendiği gibi çalışır. Şu anda işlenen bir güncelleme bloğu varsa, performBatchUpdates'in tam bloğunda reloadData'yı çağıracağım.


Tüm güncellenmiş performBatchUpdate'inizi nerede gerçekleştiriyorsunuz? Bazıları dışarıda mı? Hepsi bitti mi? Çok ilginç gönderi.
VaporwareWolf

CoreData'daki verileri göstermek için NSFetchedResultsController ile koleksiyon görünümünü kullanıyorum. NSFetchedResultsController temsilcisi değişiklikleri bildirdiğinde, tüm güncellemeleri topluyor ve bunları performBatchUpdates içinde çağırıyorum. NSFetchedResultsController istek koşulu değiştirildiğinde, reloadData çağrılmalıdır.
user2459624

Bu aslında soruya iyi bir cevap. Bir reloadItems () (animasyonlu) ve ardından reloadData () çalıştırırsanız hücreleri atlar.
biyografi

12

Hızlı 5 - 4 - 3

// GCD    
DispatchQueue.main.async(execute: collectionView.reloadData)

// Operation
OperationQueue.main.addOperation(collectionView.reloadData)

Swift 2

// Operation
NSOperationQueue.mainQueue().addOperationWithBlock(collectionView.reloadData)

4

Benim de bu problemim vardı. Tesadüfen test için yeniden yüklemeyi zorlamak için koleksiyon görünümünün üstüne bir düğme ekledim - ve birdenbire yöntemler çağrılmaya başladı.

Ayrıca şu kadar basit bir şey eklemek:

UIView *aView = [UIView new];
[collectionView addSubView:aView];

yöntemlerin çağrılmasına neden olur

Ayrıca çerçeve boyutuyla oynadım - ve işte yöntemler çağrılıyordu.

İOS7 UICollectionView ile çok sayıda hata var.


Başkalarının da bu sorunu yaşadığını görmekten (kesin olarak) memnunum. Çözüm için teşekkürler.
VaporwareWolf

3

Bu yöntemi kullanabilirsiniz

[collectionView reloadItemsAtIndexPaths:arayOfAllIndexPaths];

Aşağıdaki yöntemi kullanarak tüm bölümler ve satırlar için döngüyü yineleyerek tüm indexPathnesnelerinizi UICollectionViewdiziye ekleyebilirsiniz.arrayOfAllIndexPaths

[aray addObject:[NSIndexPath indexPathForItem:j inSection:i]];

Umarım anladınız ve sorununuzu çözebilir. Daha fazla açıklamaya ihtiyacınız olursa lütfen yanıtlayın.


3

Shaunti Fondrisi'nin verdiği çözüm neredeyse mükemmel. Ama enqueue infaz gibi kod veya kodlar böyle bir parça UICollectionView'ler reloadData()için NSOperationQueue' ler mainQueuegerçekten yapabilir çalışma döngüsünde sonraki olay döngünün başlangıcına yürütme zamanlamasını koyar UICollectionViewbir hareketiyle güncelleştirme.

Bu sorunu çözmek için. Aynı kod parçasının yürütme zamanlamasını geçerli olay döngüsünün sonuna koymalıyız, ancak bir sonrakinin başına koymamalıyız. Bunu da kullanarak başarabiliriz CFRunLoopObserver.

CFRunLoopObserver tüm girdi kaynağı bekleme etkinliklerini ve çalışma döngüsünün giriş ve çıkış etkinliğini gözlemler.

public struct CFRunLoopActivity : OptionSetType {
    public init(rawValue: CFOptionFlags)

    public static var Entry: CFRunLoopActivity { get }
    public static var BeforeTimers: CFRunLoopActivity { get }
    public static var BeforeSources: CFRunLoopActivity { get }
    public static var BeforeWaiting: CFRunLoopActivity { get }
    public static var AfterWaiting: CFRunLoopActivity { get }
    public static var Exit: CFRunLoopActivity { get }
    public static var AllActivities: CFRunLoopActivity { get }
}

Bu aktiviteler arasında, .AfterWaitingmevcut olay döngüsü bitmek .BeforeWaitingüzereyken gözlemlenebilir ve bir sonraki olay döngüsü henüz başladığında gözlemlenebilir.

NSRunLoopBaşına yalnızca bir örnek olduğu NSThreadve NSRunLooptam olarak onu yönlendirdiği için NSThread, erişimlerin NSRunLoopher zaman iş parçacıklarını asla geçmeyecek şekilde aynı örnekten geldiğini düşünebiliriz .

Daha önce bahsedilen noktalara dayanarak, şimdi kodu yazabiliriz: NSRunLoop tabanlı bir görev dağıtıcısı:

import Foundation
import ObjectiveC

public struct Weak<T: AnyObject>: Hashable {
    private weak var _value: T?
    public weak var value: T? { return _value }
    public init(_ aValue: T) { _value = aValue }

    public var hashValue: Int {
        guard let value = self.value else { return 0 }
        return ObjectIdentifier(value).hashValue
    }
}

public func ==<T: AnyObject where T: Equatable>(lhs: Weak<T>, rhs: Weak<T>)
    -> Bool
{
    return lhs.value == rhs.value
}

public func ==<T: AnyObject>(lhs: Weak<T>, rhs: Weak<T>) -> Bool {
    return lhs.value === rhs.value
}

public func ===<T: AnyObject>(lhs: Weak<T>, rhs: Weak<T>) -> Bool {
    return lhs.value === rhs.value
}

private var dispatchObserverKey =
"com.WeZZard.Nest.NSRunLoop.TaskDispatcher.DispatchObserver"

private var taskQueueKey =
"com.WeZZard.Nest.NSRunLoop.TaskDispatcher.TaskQueue"

private var taskAmendQueueKey =
"com.WeZZard.Nest.NSRunLoop.TaskDispatcher.TaskAmendQueue"

private typealias DeallocFunctionPointer =
    @convention(c) (Unmanaged<NSRunLoop>, Selector) -> Void

private var original_dealloc_imp: IMP?

private let swizzled_dealloc_imp: DeallocFunctionPointer = {
    (aSelf: Unmanaged<NSRunLoop>,
    aSelector: Selector)
    -> Void in

    let unretainedSelf = aSelf.takeUnretainedValue()

    if unretainedSelf.isDispatchObserverLoaded {
        let observer = unretainedSelf.dispatchObserver
        CFRunLoopObserverInvalidate(observer)
    }

    if let original_dealloc_imp = original_dealloc_imp {
        let originalDealloc = unsafeBitCast(original_dealloc_imp,
            DeallocFunctionPointer.self)
        originalDealloc(aSelf, aSelector)
    } else {
        fatalError("The original implementation of dealloc for NSRunLoop cannot be found!")
    }
}

public enum NSRunLoopTaskInvokeTiming: Int {
    case NextLoopBegan
    case CurrentLoopEnded
    case Idle
}

extension NSRunLoop {

    public func perform(closure: ()->Void) -> Task {
        objc_sync_enter(self)
        loadDispatchObserverIfNeeded()
        let task = Task(self, closure)
        taskQueue.append(task)
        objc_sync_exit(self)
        return task
    }

    public override class func initialize() {
        super.initialize()

        struct Static {
            static var token: dispatch_once_t = 0
        }
        // make sure this isn't a subclass
        if self !== NSRunLoop.self {
            return
        }

        dispatch_once(&Static.token) {
            let selectorDealloc: Selector = "dealloc"
            original_dealloc_imp =
                class_getMethodImplementation(self, selectorDealloc)

            let swizzled_dealloc = unsafeBitCast(swizzled_dealloc_imp, IMP.self)

            class_replaceMethod(self, selectorDealloc, swizzled_dealloc, "@:")
        }
    }

    public final class Task {
        private let weakRunLoop: Weak<NSRunLoop>

        private var _invokeTiming: NSRunLoopTaskInvokeTiming
        private var invokeTiming: NSRunLoopTaskInvokeTiming {
            var theInvokeTiming: NSRunLoopTaskInvokeTiming = .NextLoopBegan
            guard let amendQueue = weakRunLoop.value?.taskAmendQueue else {
                fatalError("Accessing a dealloced run loop")
            }
            dispatch_sync(amendQueue) { () -> Void in
                theInvokeTiming = self._invokeTiming
            }
            return theInvokeTiming
        }

        private var _modes: NSRunLoopMode
        private var modes: NSRunLoopMode {
            var theModes: NSRunLoopMode = []
            guard let amendQueue = weakRunLoop.value?.taskAmendQueue else {
                fatalError("Accessing a dealloced run loop")
            }
            dispatch_sync(amendQueue) { () -> Void in
                theModes = self._modes
            }
            return theModes
        }

        private let closure: () -> Void

        private init(_ runLoop: NSRunLoop, _ aClosure: () -> Void) {
            weakRunLoop = Weak<NSRunLoop>(runLoop)
            _invokeTiming = .NextLoopBegan
            _modes = .defaultMode
            closure = aClosure
        }

        public func forModes(modes: NSRunLoopMode) -> Task {
            if let amendQueue = weakRunLoop.value?.taskAmendQueue {
                dispatch_async(amendQueue) { [weak self] () -> Void in
                    self?._modes = modes
                }
            }
            return self
        }

        public func when(invokeTiming: NSRunLoopTaskInvokeTiming) -> Task {
            if let amendQueue = weakRunLoop.value?.taskAmendQueue {
                dispatch_async(amendQueue) { [weak self] () -> Void in
                    self?._invokeTiming = invokeTiming
                }
            }
            return self
        }
    }

    private var isDispatchObserverLoaded: Bool {
        return objc_getAssociatedObject(self, &dispatchObserverKey) !== nil
    }

    private func loadDispatchObserverIfNeeded() {
        if !isDispatchObserverLoaded {
            let invokeTimings: [NSRunLoopTaskInvokeTiming] =
            [.CurrentLoopEnded, .NextLoopBegan, .Idle]

            let activities =
            CFRunLoopActivity(invokeTimings.map{ CFRunLoopActivity($0) })

            let observer = CFRunLoopObserverCreateWithHandler(
                kCFAllocatorDefault,
                activities.rawValue,
                true, 0,
                handleRunLoopActivityWithObserver)

            CFRunLoopAddObserver(getCFRunLoop(),
                observer,
                kCFRunLoopCommonModes)

            let wrappedObserver = NSAssociated<CFRunLoopObserver>(observer)

            objc_setAssociatedObject(self,
                &dispatchObserverKey,
                wrappedObserver,
                .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }

    private var dispatchObserver: CFRunLoopObserver {
        loadDispatchObserverIfNeeded()
        return (objc_getAssociatedObject(self, &dispatchObserverKey)
            as! NSAssociated<CFRunLoopObserver>)
            .value
    }

    private var taskQueue: [Task] {
        get {
            if let taskQueue = objc_getAssociatedObject(self,
                &taskQueueKey)
                as? [Task]
            {
                return taskQueue
            } else {
                let initialValue = [Task]()

                objc_setAssociatedObject(self,
                    &taskQueueKey,
                    initialValue,
                    .OBJC_ASSOCIATION_RETAIN_NONATOMIC)

                return initialValue
            }
        }
        set {
            objc_setAssociatedObject(self,
                &taskQueueKey,
                newValue,
                .OBJC_ASSOCIATION_RETAIN_NONATOMIC)

        }
    }

    private var taskAmendQueue: dispatch_queue_t {
        if let taskQueue = objc_getAssociatedObject(self,
            &taskAmendQueueKey)
            as? dispatch_queue_t
        {
            return taskQueue
        } else {
            let initialValue =
            dispatch_queue_create(
                "com.WeZZard.Nest.NSRunLoop.TaskDispatcher.TaskAmendQueue",
                DISPATCH_QUEUE_SERIAL)

            objc_setAssociatedObject(self,
                &taskAmendQueueKey,
                initialValue,
                .OBJC_ASSOCIATION_RETAIN_NONATOMIC)

            return initialValue
        }
    }

    private func handleRunLoopActivityWithObserver(observer: CFRunLoopObserver!,
        activity: CFRunLoopActivity)
        -> Void
    {
        var removedIndices = [Int]()

        let runLoopMode: NSRunLoopMode = currentRunLoopMode

        for (index, eachTask) in taskQueue.enumerate() {
            let expectedRunLoopModes = eachTask.modes
            let expectedRunLoopActivitiy =
            CFRunLoopActivity(eachTask.invokeTiming)

            let runLoopModesMatches = expectedRunLoopModes.contains(runLoopMode)
                || expectedRunLoopModes.contains(.commonModes)

            let runLoopActivityMatches =
            activity.contains(expectedRunLoopActivitiy)

            if runLoopModesMatches && runLoopActivityMatches {
                eachTask.closure()
                removedIndices.append(index)
            }
        }

        taskQueue.removeIndicesInPlace(removedIndices)
    }
}

extension CFRunLoopActivity {
    private init(_ invokeTiming: NSRunLoopTaskInvokeTiming) {
        switch invokeTiming {
        case .NextLoopBegan:        self = .AfterWaiting
        case .CurrentLoopEnded:     self = .BeforeWaiting
        case .Idle:                 self = .Exit
        }
    }
}

Önceki kodla, artık UICollectionView's'nin yürütülmesini reloadData()geçerli olay döngüsünün sonuna böyle bir kod parçasıyla gönderebiliriz :

NSRunLoop.currentRunLoop().perform({ () -> Void in
     collectionView.reloadData()
    }).when(.CurrentLoopEnded)

Aslında, böyle bir NSRunLoop tabanlı görev dağıtıcısı zaten benim kişisel kullanılan çerçevemden birindeydi: Nest. Ve işte GitHub'daki deposu: https://github.com/WeZZard/Nest


2
 dispatch_async(dispatch_get_main_queue(), ^{

            [collectionView reloadData];
            [collectionView layoutIfNeeded];
            [collectionView reloadData];


        });

benim için çalıştı.


1

Her şeyden önce bu konu için teşekkürler, çok yardımcı. Verileri Yeniden Yükle ile ilgili benzer bir sorun yaşadım, ancak belirti, belirli hücrelerin artık kalıcı bir şekilde seçilemeyeceği halde diğerleri seçilebilirdi. İndexPathsForSelectedItems yöntemine veya eşdeğerine çağrı yok. Hata ayıklama, Verileri Yeniden Yükle'ye işaret etti. Yukarıdaki iki seçeneği de denedim; ve benim durumumda diğer seçenekler işe yaramadığı veya koleksiyon görünümünü yaklaşık bir milisaniye kadar flaş yaptığı için ReloadItemsAtIndexPaths seçeneğini benimsemeye başladım. Aşağıdaki kod iyi çalışıyor:

NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; 
NSIndexPath *indexPath;
for (int i = 0; i < [self.assets count]; i++) {
         indexPath = [NSIndexPath indexPathForItem:i inSection:0];
         [indexPaths addObject:indexPath];
}
[collectionView reloadItemsAtIndexPaths:indexPaths];`

0

Benimle de iOS 8.1 sdk'de oldu, ancak datasourceyöntemi güncelledikten sonra bile numberOfItemsInSection:yeni öğe sayısını döndürmediğini fark ettiğimde doğru anladım . Sayımı güncelledim ve çalıştırdım.


bu sayıyı nasıl güncellediniz lütfen .. Yukarıdaki tüm yöntemler benim için hızlı 3'te
çalışamadı

0

UICollectionView.contentInset'i ayarladınız mı? sol ve sağ kenarları kaldırın


0

UICollectionView Delegate yöntemlerinden her birinin yapmasını beklediğiniz şeyi yaptığını denetleyin. Örneğin, eğer

collectionView:layout:sizeForItemAtIndexPath:

geçerli bir boyut döndürmez, yeniden yükleme çalışmaz ...


0

bu kodu deneyin.

 NSArray * visibleIdx = [self.collectionView indexPathsForVisibleItems];

    if (visibleIdx.count) {
        [self.collectionView reloadItemsAtIndexPaths:visibleIdx];
    }

0

Swift 4'te benim için şu şekilde çalıştı

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

let cell = campaignsCollection.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! Cell

cell.updateCell()

    // TO UPDATE CELLVIEWS ACCORDINGLY WHEN DATA CHANGES
    DispatchQueue.main.async {
        self.campaignsCollection.reloadData()
    }

    return cell
}

-1
inservif (isInsertHead) {
   [self insertItemsAtIndexPaths:tmpPoolIndex];
   NSArray * visibleIdx = [self indexPathsForVisibleItems];
   if (visibleIdx.count) {
       [self reloadItemsAtIndexPaths:visibleIdx];
   }
}else if (isFirstSyncData) {
    [self reloadData];
}else{
   [self insertItemsAtIndexPaths:tmpPoolIndex];
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.