سؤال

تحطمت Sizewithfont في Multithread ، هذه هي معلومات التصحيح:

1 0x00a0df8e in icu::RuleBasedBreakIterator::handleNext
2 0x00a0daff in icu::RuleBasedBreakIterator::next
3 0x00a0d174 in icu::RuleBasedBreakIterator::following
4 0x35879719 in WebCore::nextBreakablePosition
5 0x3587842a in -[NSString(WebStringDrawing) _web_drawInRect:withFont:ellipsis:alignment:lineSpacing:includeEmoji:measureOnly:]
6 0x35877da3 in -[NSString(WebStringDrawing) _web_sizeInRect:withFont:ellipsis:lineSpacing:]
7 0x3090d238 in -[NSString(UIStringDrawing) sizeWithFont:constrainedToSize:lineBreakMode:lineSpacing:]
8 0x3090cee3 in -[NSString(UIStringDrawing) sizeWithFont:constrainedToSize:lineBreakMode:]

الآن أقوم بحل الخطأ باستخدام كائن NSLOCK ، قبل استخدام هذه الوظيفة ، سألقي هذه الكائن ، وبعد ذلك فتحه

لكنني أعتقد أنه يجب أن يكون هناك حل أفضل!

ووجدت أن هذا الخطأ ظهر فقط عندما يكون كائن NSString لهذه الوظيفة على كلا الموضوعين نصًا متعدد الخطوط

هل كانت مفيدة؟

المحلول

كقاعدة عامة ، يجب ألا تستدعي أساليب Uikit [1] من مؤشر ترابط منفصل. لا يهم إذا كنت تأخذ أقفال ، فهذا أمر غير مستمر.

عندما تستخدم تطبيقات متعددة الخيوط ، تحتاج إلى التأكد من أن أي رمز يمس أي كائنات UIKIT يتم تنفيذها على الموضوع الرئيسي. يتم تحقيق ذلك من خلال استخدام PerfortseSelectorOnMainThread: withObject: Waituntildone: الطريقة التي تستدعي المحدد المعطى على الموضوع الرئيسي:

http://developer.apple.com/iphone/library/documentation/cocoa/reference/foundation/classes/nsobject_class/reference/Reference.html#//apple_ref/occ/instm/nsobjectontonctoronmector:

أو في monotouch: foo.invokeonMainThread (مندوب {your_code_here}) ؛

1] مع iOS 4.0 ، يتم استرخاء القاعدة لحفنة من واجهات برمجة التطبيقات.

نصائح أخرى

  • التنسيق ، من فضلك.

  • "حل" مشكلة متعددة الخيوط عن طريق وضع أقفال عشوائية حول الكائنات ليست هي الإجابة الصحيحة. قط. يتطلب متعدد الخيوط تصميمًا منهجيًا لتطبيقك.

  • إذا قام القفل "بإصلاح" المشكلة ، فأظهر ما تم قفله وكيف يكون من الأهمية بمكان تقييم الموقف.

  • بعض الأعراض الأخرى ستكون مفيدة. رمز ، على وجه الخصوص. الكود في أسئلتك مفيدة للغاية.

بالنظر إلى عدم وجود أدلة ، كنت أراهن على تحول سلسلة على خيط واحد أثناء محاولة الاستيلاء على الحجم على آخر. أو يتم إصدار الكائن على موضوع واحد بينما لا يزال يستخدمه آخر. أو تقوم بمعالجة كائن من مؤشر ترابط ثانوي غير آمن.

أعتقد أن أداء SelectionOnMainThread: WithObject: Waituntildone: صحيح ،

قبل ذلك ، أستخدم عملية لحساب حجم النص ، واستخدام WaituntIlAllallySarefised في الخيط الرئيسي لانتظار عودة العملية ،
ولكن إذا استخدمت أيضًا أداء selectoSeSelectorOnMainThread: withObject: Waituntildone في العملية ، وقم بتعيين معلمة Waituntildone على نعم (لأنني بحاجة إلى النتيجة)
سيتمسك الخيط الرئيسي

حتى الآن أقوم بإزالة WaituntilAllallysirefised ، واستخدم كائنًا غير متزامن لضمان عدم بدء العملية حتى توقفت العملية السابقة

                    [md removeAllObjects];
                    [md setObject:subString forKey:@"text"];
                    [md setObject:[NSNumber numberWithInt:view_w ] forKey:@"width"];
                    [md setObject:[NSNumber numberWithInt:height_left + font_h ] forKey:@"height"];
                    [self  performSelectorOnMainThread:
                     @selector(calculateTextRegion:)
                                            withObject:md
                                         waitUntilDone:YES];
                    CGSize stringSize = textRegion;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top