2010-02-27 2 views
1

Я пытаюсь выполнить поиск в базе данных LDAP с использованием метода ODQuery. Я следующий код настройки:Поиск ошибок в каталоге с помощью ODQuery

- (void)awakeFromNib 
{ 
[self startSearch:@"john"]; 
} 

- (void)startSearch:(NSString *)searchString 
{ 
nodeName = @"http://sububria.org.au"; 
session = [ODSession defaultSession]; 
searchNode = [[ODNode alloc] init]; 
searchNode = [ODNode nodeWithSession:session name:nodeName error:NULL]; 

query = [[ODQuery alloc] initWithNode:searchNode 
         forRecordTypes:kODRecordTypePeople 
          attribute:kODAttributeTypeAllAttributes 
          matchType:kODMatchInsensitiveContains 
          queryValues:searchString 
        returnAttributes:kODAttributeTypeAllAttributes 
         maximumResults:0 
           error:NULL]; 

[query setDelegate:self]; 
[query scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
} 

- (void)query:(ODQuery *)inSearch foundResults:(NSArray *)inResults error:(NSError *)inError 
{ 
NSLog (@"Search ran"); 
NSLog (@"%@", inResults); 
} 

Я довольно новыми для этого, так что я не уверен, что я мог бы делать неправильно. Я не получаю никаких предупреждений или ошибок в Xcode, мое приложение просто сбой при запуске поискового запроса.

Ошибка консолидации, но самые последние элементы в стеке потоков;

CFRetain 
_ODQueryInitWIthNode 
-[ODQuery initWithNode:forRecordTypes:attribute:matchType:queryValues:returnAttributes:maximumResults:error:] 
-[MyAppDelegate startSearch:] 
-[MyAppDelegate applicationDidFinishLaunching:] 

Буду признателен за любую помощь. Рикки.

+0

Не передавайте 'nil' параметру' error: '. Во-первых, тип этого параметра не является указателем на объект (например, 'NSError *'); это указатель на указатель на объект ('NSError **'), поэтому правильная константа нулевого указателя равна 'NULL'. 'nil' для указателей на объекты,' Nil' для классов; 'NULL' для всего остального. Что еще более важно, никогда не подавляйте ошибки, особенно когда что-то не работает. Метод может пытаться рассказать вам, что вы делаете неправильно, и это может быть причиной сбоя (если он пытается назначить указатель объекта ошибки нулевому указателю, который вы ему дали). –

+0

Кроме того, вы не должны использовать 'stringWithFormat:' ничем, кроме строки формата. Литеральная строка - это строка; вы можете просто назначить его непосредственно переменной 'NSString *'. –

+0

Вам не нужно выделять и инициализировать узел только для замены его другим узлом сразу после этого. Делать это бессмысленно, и это делается без освобождения первого узла. –

ответ

1

Все, что вы сделали, это создать запрос; вы на самом деле не начали поиск.

Для поиска синхронно, ask the query for all the results at once. Если вы пройдете NO (что означает возвращение все результатов), это может занять некоторое время.

Чтобы искать асинхронно и получать информацию, когда у него есть больше результатов для вас, be the query's delegate, а затем schedule the query on a run loop.

Редактировать: Кроме того, я сомневаюсь, что «http://server.org» является допустимым именем узла. Вероятно, поэтому node является nil.

+0

Привет Питер. Спасибо за ваш ответ. три соответствующие строки кода, но мое приложение по-прежнему падает с помощью метода initWithNode.Я отлаживал свой код и по какой-то причине searchNode имеет адрес памяти 0x0, поэтому он был выпущен. Где я не знаю. – Ricky

+0

О, я не видел бит об аварии. Измените свой вопрос, чтобы включить журнал сбоев. –

+0

Переменная, содержащая 'nil' (0x0) не означает, что объект был освобожден, это означает, что вам никогда не приходилось начинать с этого. Объект, освобожденный от действия, не будет волшебным образом устанавливать любые переменные, которые ссылались на него, на «nil», они все равно будут ссылаться на его старый адрес. Вот почему важно убедиться, что ничего не осталось ows о (и может использовать) объект, который больше ничего не имеет (и так умер). –

Смежные вопросы