Grand Central Dispatch - تمرير البيانات بين المواضيع
-
29-09-2019 - |
سؤال
أحاول تشغيل عملية في الخلفية لإنشاء سلسلة ، يتم استخدامها بعد ذلك في الخيط الرئيسي (يتم إرسالها إلى خادم بعيد.) يعمل الرمز بشكل جيد في المحاكاة ، ويتم تسجيل السلسلة مرتين كما هو متوقع.
على جهاز (iPad ، 4.2 و iPhone المختلفة) ، يتم تعطله في كل مرة مع EXC_BAD_ACCESS. يبدو أن MyString ينفد من النطاق ، ولكن يبدو أن هذا يتعارض مع المثال على ويكيبيديا حيث يتم استخدام نفس المبدأ.
رمز على النحو التالي:
dispatch_async(_queue, ^{
NSString *myString = [self generateString];
NSLog(@"1 String is %@", myString);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"2 String is %@", myString);
});
});
هل يعرف أي شخص لماذا هذا يعطل ، وأفضل طريقة لإصلاحه؟
لقد ارتكبت خطأ تبسيط الكود الخاص بي للحفاظ على سؤالي واضحًا.
في قائمة الانتظار الرئيسية ، قمت بالفعل بالرسالة ذاتية مع مكالمة أخرى وهذا يؤدي إلى سوء الوصول.
كان الحل هو استدعاء الطريقة في قائمة انتظار Async الخاصة بي ، وداخل الطريقة لف الرمز في Dispatch_async (dispatch_get_main_queue () ، ^{}) ؛ الكتلة.
اتمنى ان يساعد هذا شخصا اخر.
المحلول
لقد ارتكبت خطأ تبسيط الكود الخاص بي للحفاظ على سؤالي واضحًا.
في قائمة الانتظار الرئيسية ، قمت بالفعل بالرسالة ذاتية مع مكالمة أخرى وهذا يؤدي إلى سوء الوصول.
كان الحل هو استدعاء الطريقة في قائمة انتظار Async الخاصة بي ، وداخل الطريقة لف الرمز في Dispatch_async (dispatch_get_main_queue () ، ^{}) ؛ الكتلة.
اتمنى ان يساعد هذا شخصا اخر.
نصائح أخرى
سيكون تخميني أن NSString هو كائن Autorelease ، لذا سيتم الخروج من النطاق وإصداره قبل استخدامه في كتلة رمز الانتظار الرئيسية. حاول إضافة الاحتفاظ/الإصدار إلى NSString:
dispatch_async(_queue, ^{
NSString *myString = [self generateString];
[myString retain];
NSLog(@"1 String is %@", myString);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"2 String is %@", myString);
[myString release];
});
});