2012-06-15 7 views
9
2012-06-15 17:53:25.532 BadgerNew[3090:707] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[_PFBatchFaultingArray objectAtIndex:]: index (0) beyond bounds (0)' 
*** First throw call stack: 
(0x353f688f 0x3779d259 0x353f6789 0x353f67ab 0x35d5fee3 0x5a5c9 0x59fd3 0x43819 0x32e63c8b 0x38153 0x38309 0x32e63c8b 0x4142d 0x32e63c8b 0x32ec363d 0x32ec35db 0x32ec2f15 0x32ec2c49 0x35d21 0x32e62cab 0x32e5c7dd 0x32e2aac3 0x32e2a567 0x32e29f3b 0x36fe922b 0x353ca523 0x353ca4c5 0x353c9313 0x3534c4a5 0x3534c36d 0x32e5b86b 0x32e58cd5 0x35a73 0x35a54) 
terminate called throwing an exception(lldb) 

समस्या क्या है?_PFBatchFaultingArray ऑब्जेक्टएट इंडेक्स:

यह मुख्य पर बिल्कुल सही है। तो मुझे यह भी नहीं पता कि कौन सी रेखा इसका कारण बनती है।

संकेत: सिम्युलेटर पर चलाएं। मेरे आईफोन पर चलाओ। मेरे दोस्त के आईफोन पर नहीं चलता है।

उत्तर

8

आप relly किसी भी अनुमान के लिए पर्याप्त जानकारी नहीं दी ... लेकिन यहाँ आप कर रहे हैं:

  1. आप CoreData उपयोग करते हैं? कोई सोचता है कि आपके कोरडाटा में डेटा है, लेकिन जब पूछा गया कि कोई नहीं है। क्रैश होगा, जब कोई पहली वस्तु (क्रैश रिपोर्ट में उल्लिखित इंडेक्स 0) के लिए fetchedResultsController.fetchedObjects पूछता है, लेकिन यह मौजूद नहीं है (क्रैश रिपोर्ट में उल्लिखित 0 से 0)
  2. "सीमा से परे सूचकांक" सामान्य त्रुटि है सरणी से संबंधित नोट। त्रुटि रिपोर्ट कहती है कि कोई सरणी (इंडेक्स 0) के पहले आइटम के लिए पूछ रहा था, लेकिन वह सरणी खाली थी (सीमा 0)। यह एक दुर्घटना है।

फिक्स यह सुनिश्चित करने के लिए से पहले डेटा सुनिश्चित करें। एक तरह से, फिर भी

if ([myArray count] > index) 
    value = [myArray objectAtIndex:index]; 

जाँच करने के लिए है मेरी सबसे अच्छी अनुमान है कि PFBatchFaultingArray CoreData को संदर्भित करता है और इसका मतलब है कि कोई आसान जवाब नहीं है।

क्या आपके पास उदा। प्रमाणीकरण विफलता, जिसने CoreData अद्यतन को मजबूर किया, लेकिन एफआरसी अभी भी पुराने डेटा को इंगित कर रहे हैं? क्रैश होगा, जब "पुराना" फ्रैंक अभी भी उतना ही डेटा सोचता है जितना पिछली बार देखा गया था, लेकिन कोरडाटा में "नया" डेटा वास्तव में कम संख्या में है। फिर स्वचालित UITableView अद्यतन पंक्ति के लिए डेटा पूछेगा, जो अब और== क्रैश मौजूद नहीं है। फिर किसी भी डेटा का उपयोग करने का प्रयास करने से पहले आपको अपने फ्रैक्स रीफ्रेश करने की आवश्यकता है। केवल आपको पता चलेगा कि कब या कहाँ ताज़ा किया जा सकता है।

9

ठीक है, मुझे लगता है कि मुझे पता चला क्यों। यह NSFetchedResultsController में कैश का कारण है। यह बकवास है। यदि आप NSSortDescriptor को आरोही से उतरने के लिए भी बदलते हैं, तो आपको मैन्युअल रूप से कैश को हटाना होगा।

तो जब संदर्भ बदलता है और कैश को इसका एहसास नहीं होता है, तो यह पसीना हो जाता है और आपके द्वारा देखी जाने वाली त्रुटियों को फेंकता है। ऐसा तब हो सकता है जब आप XCode में निर्माण को हिट करते हैं: संदर्भ सहेजा नहीं गया है (और इसका डेटा खो देता है) लेकिन कैश सोचता है कि यह शून्य डेटा के साथ पुनरारंभ होने पर ऐसा होना चाहिए, यह आश्चर्यचकित हो जाता है और यह नहीं जानता कि इसे कैसे संभाला जाए।

कैश को हटाने से इस समस्या से छुटकारा मिल जाता है। मुझे लगता है कि ऐसा इसलिए हो सकता है कि ऐप्पल ने इसे UICollectionViewController के साथ उपयोग करना बंद कर दिया। बस ऐसी समस्या है।

संपादित करें: यदि पंक्ति/अनुभाग NSFetchedResultsController की संबंधित गिनती से अधिक नहीं है, तो यह जांच नहीं करता है, क्योंकि फिर से, ऐसा लगता है कि डेटा वहां होना चाहिए लेकिन ऐसा नहीं है।

+1

मैन्युअल रूप से कैश को कैसे हटाते हैं? – Lytic

+0

NSFetchedResultsController.deleteCacheWithName() – powertoold

1

यदि आप NSFetchRequest पर "PropertiesToFetch" सेट कर रहे हैं, और यदि वे गुण डेटाबेस में शून्य हैं, तो आपको यह त्रुटि भी मिल जाएगी।

फिक्स उस संपत्ति को वैकल्पिक बनाने के लिए है, और इसे प्रीफ़ेच न करें।

उदाहरण:

अगर 'छात्र < ---> बैकपैक' अपने मॉडल है।

let fetchRequest = ... 
    fetchRequest.propertiesToFetch = ["backpack"] 

    ... 

क्रैश तब होता है जब बैकपैक शून्य होता है।

संबंधित मुद्दे